cyrus-imapd bug(?) and possible bug-fix
Aristotelis
arisg at noc.uoa.gr
Tue Jul 13 04:52:22 EDT 2004
Hello all,
A bug[1] in cyrus imapd was reported to me[2] by Patrick T. Tsang, that has
to do with renaming folder when using unix hierarchy separators, altnamespace and
virtual domains. The problem is illustrated in the following session:
. login arisg at edunet.gr HiI'mAPassowd
. OK User logged in
. list * *
* LIST (\Noinferiors) "/" "INBOX"
* LIST (\HasNoChildren) "/" "Drafts"
* LIST (\HasChildren) "/" "FolderA"
* LIST (\HasChildren) "/" "FolderA/FolderB"
* LIST (\HasNoChildren) "/" "FolderA/FolderB/FolderC"
* LIST (\HasNoChildren) "/" "Sent"
* LIST (\HasNoChildren) "/" "Templates"
* LIST (\HasNoChildren) "/" "Trash"
* LIST (\HasNoChildren) "/" "lala"
. OK Completed (0.000 secs 10 calls)
. rename FolderA/FolderB FolderA/FolderBB
* OK rename Other Users/arisg/FolderA/FolderB Other Users/arisg/FolderA/FolderBB
. OK Completed
Actually there should be two things different IMHO. There shouldn't
be the Other Users part, and FolderA/FolderB/FolderC should also
be renamed in FolderA/FolderBB/FolderC.
If I use the default domain and logon in to the machine I get:
. login arisg OupsDidICopyAPassword?
. OK User logged in
. list * *
* LIST (\Noinferiors) "/" "INBOX"
* LIST (\HasNoChildren) "/" "Drafts"
* LIST (\HasChildren) "/" "FolderA"
* LIST (\HasChildren) "/" "FolderA/FolderB"
* LIST (\HasNoChildren) "/" "FolderA/FolderB/FolderC"
* LIST (\HasNoChildren) "/" "Sent"
* LIST (\HasNoChildren) "/" "Templates"
* LIST (\HasNoChildren) "/" "Trash"
* LIST (\HasNoChildren) "/" "lala"
. OK Completed (0.000 secs 10 calls)
. rename FolderA/FolderB FolderA/FolderBB
* OK rename FolderA/FolderB FolderA/FolderBB
* OK rename FolderA/FolderB/FolderC FolderA/FolderBB/FolderC
So i include a small patch that fixes this problem.
. login arisg at edunet.gr OupsIThinkISawAPassowd
. OK User logged in
. list * *
* LIST (\Noinferiors) "/" "INBOX"
* LIST (\HasNoChildren) "/" "Drafts"
* LIST (\HasChildren) "/" "FolderA"
* LIST (\HasChildren) "/" "FolderA/FolderB"
* LIST (\HasNoChildren) "/" "FolderA/FolderB/FolderC"
* LIST (\HasNoChildren) "/" "Sent"
* LIST (\HasNoChildren) "/" "Templates"
* LIST (\HasNoChildren) "/" "Trash"
* LIST (\HasNoChildren) "/" "lala"
. OK Completed (0.000 secs 10 calls)
. rename FolderA/FolderB FolderA/FolderBB
* OK rename FolderA/FolderB FolderA/FolderBB
* OK rename FolderA/FolderB/FolderC FolderA/FolderBB/FolderC
. OK Completed
This patch however was developped quite quickly in order
to solve the problem on a particular server, so the patch
is not tested extensively (Patrick didn't report any complains
so far, and everything is working as it is supposed to, nothing
else was broken with this patch till now). Actually
if anyone of the cyrus developers argues that the problem
should be tackled in different place in the cyrus code ..
probably i won't argue with that either.
Best regards,
Aristotelis
[1] Actually, I don't know if this is a feature or not. Or
even if the configuration options used cause any problems
[2] Actually, Patrick thought that there was a problem with
the autocreation of folders so he sent me an email. I was able
to recreate the problem, so i just a quick look at it.
P.S> Thanks to Patrick for offering me the playground... eeerm
the testing environment :)))
-------------- next part --------------
diff -Naur cyrus-imapd-2.2.6/imap/mboxlist.c cyrus-imapd-2.2.6.autocreate.patrick2.uncompiled/imap/mboxlist.c
--- cyrus-imapd-2.2.6/imap/mboxlist.c 2004-05-22 06:45:51.000000000 +0300
+++ cyrus-imapd-2.2.6.autocreate.patrick2.uncompiled/imap/mboxlist.c 2004-07-08 14:54:57.000000000 +0300
@@ -1900,7 +1900,11 @@
if (userid && (p = strrchr(userid, '@'))) {
userlen = p - userid;
domainlen = strlen(p); /* includes separator */
- snprintf(domainpat, sizeof(domainpat), "%s!%s", p+1, pattern);
+ snprintf(domainpat, sizeof(domainpat), "%s!", p+1);
+ if(strchr(pattern,'!')) {
+ pattern+=domainlen;
+ strlcat(domainpat, pattern, sizeof(domainpat));
+ }
}
if ((p = strrchr(pattern, '@'))) {
/* global admin specified mbox at domain */
diff -Naur cyrus-imapd-2.2.6/imap/mboxname.c cyrus-imapd-2.2.6.autocreate.patrick2.uncompiled/imap/mboxname.c
--- cyrus-imapd-2.2.6/imap/mboxname.c 2004-05-22 06:45:51.000000000 +0300
+++ cyrus-imapd-2.2.6.autocreate.patrick2.uncompiled/imap/mboxname.c 2004-07-08 14:54:44.000000000 +0300
@@ -369,6 +369,15 @@
{
char *domain;
+ char *user = NULL;
+
+ if((domain = strchr(userid,'@'))) {
+ user = xmalloc((domain-userid+1)*sizeof(char));
+ strlcpy(user, userid,(domain-userid+1));
+ }
+ else
+ user = userid;
+
/* Blank the result, just in case */
result[0] = '\0';
@@ -376,7 +385,7 @@
if (!userid) return IMAP_MAILBOX_BADNAME;
- if (config_virtdomains && (domain = strchr(userid, '@')) &&
+ if (config_virtdomains && domain &&
!strncmp(name, domain+1, strlen(domain)-1) &&
name[strlen(domain)-1] == '!')
name += strlen(domain);
@@ -391,13 +400,13 @@
}
/* paranoia - this shouldn't be needed */
else if (!strncmp(name, "user.", 5) &&
- !strncmp(name+5, userid, strlen(userid)) &&
- (name[5+strlen(userid)] == '\0' ||
- name[5+strlen(userid)] == '.')) {
- if (name[5+strlen(userid)] == '\0')
+ !strncmp(name+5, user, strlen(user)) &&
+ (name[5+strlen(user)] == '\0' ||
+ name[5+strlen(user)] == '.')) {
+ if (name[5+strlen(user)] == '\0')
strcpy(result, "INBOX");
else
- strcpy(result, name+5+strlen(userid)+1);
+ strcpy(result, name+5+strlen(user)+1);
}
/* Other Users namespace */
@@ -427,6 +436,9 @@
/* Translate any separators in mailboxname */
mboxname_hiersep_toexternal(namespace, result, 0);
+
+ if(user!=userid)
+ free(user);
return 0;
}
More information about the Info-cyrus
mailing list