[Dovecot] Pine and prefix - LIST command bug?

Chris Wakelin c.d.wakelin at reading.ac.uk
Mon Mar 21 14:09:59 EET 2005


On Fri, 18 Mar 2005 19:52:34 +0200 Timo Sirainen <tss at iki.fi> wrote:

> On 18.3.2005, at 19:36, Chris Wakelin wrote:
> 
> > An empty ("" string) mailbox name argument is a special request to
> >       return the hierarchy delimiter and the root name of the name 
> > given
> >       in the reference.  The value returned as the root MAY be null if
> >       the reference is non-rooted or is null.  In all cases, the
> >       hierarchy delimiter is returned.  This permits a client to get 
> > the
> >       hierarchy delimiter even when no mailboxes by that name currently
> >       exist.
> ..
> > Mind you, it looks like at least our UW-IMAP also gets it wrong for
> > "~/mail/". Of course, I may be misunderstanding something!
> 
> No, after reading it through several times and testing how UW-IMAP 
> reacts to different input, I finally understood it. The "root name" 
> means the first part of the hierarchical mailbox name (um. is that any 
> more understandable?). Eg. "foo/bar/baz" -> "foo/". I'll change it to 
> return that.

Ah! That makes more sense, and in that case UW-IMAP isn't getting it 
wrong for "~/mail/" after all.

I've tried your fix, but it doesn't seem to work. I'm still getting '* 
LIST (\NoSelect) "/" ""' for all the hidden namespaces.

Looking at the code, my guess is that the namespace_find() call is 
modifying "ref" and so the strchr() never finds a match. This patch

--- dovecot-1.0-stable.orig/src/imap/cmd-list.c Fri Mar 18 20:00:44 2005
+++ dovecot-1.0-stable/src/imap/cmd-list.c      Mon Mar 21 11:53:26 2005
@@ -366,7 +366,8 @@
                   concept which probably no other client uses than Pine.
                   Just try our best to emulate UW-IMAP behavior and hopefully
                   we're fine. */
-               ns = namespace_find(client->namespaces, &ref);
+               const char *ref_copy = t_strdup(ref);
+               ns = namespace_find(client->namespaces, &ref_copy);
                if (ns == NULL) {
                        const char *empty = "";
                        ns = namespace_find(client->namespaces, &empty);

seems to work, but I'm no expert in C (I program by imitation ;-) ), so 
I may have made a mistake with pointers, consts, string functions etc.

Having said that, Pine is still getting confused. This time it's trying 
'LIST "" ~/mail' and getting no results whereas UW-IMAP gives '* LIST 
(\NoSelect) "/" ~/mail'.

Best Wishes,
Chris

--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--
Christopher Wakelin,                                c.d.wakelin at reading.ac.uk
IT Services Centre, The University of Reading,       Tel: +44 (0)118 378 8439
Whiteknights, Reading, RG6 2AF, UK                   Fax: +44 (0)118 975 3094




More information about the dovecot mailing list