Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't view (other) users subfolders with imapd 3.0.6 #2362

Closed
neverexists opened this issue May 18, 2018 · 7 comments
Closed

Can't view (other) users subfolders with imapd 3.0.6 #2362

neverexists opened this issue May 18, 2018 · 7 comments
Assignees
Labels
3.0 affects 3.0 3.1 affects 3.1 dev releases

Comments

@neverexists
Copy link

Hi after migrating from cyrus-imapd-2.4.17 to cyrus-imapd-3.0.6 we cannot view (other) users subfolders.

Distro:Gentoo
Cyrus version: cyrus-imapd-3.0.6 (tested also with 3.0.5 and 3.0.7)

imapd-3.0.5.conf attached

In the test environment we created a user named "aaa" and "bbb", then
we created the folder "bbb/mytest/mysubtest". We set the acl for the
user aaa to share the mailbox bbb/mytest/mysubtest

user.aaa 0 default aaa lrswipkxtecdan anonymous p
user.bbb 0 default bbb lrswipkxtecdan anonymous p
aaa lrswipkxtecdan
user.bbb.mytest 0 default bbb lrswipkxtecdan anonymous p
aaa lrswipkxtecdan
user.bbb.mytest.mysubtest 0 default
bbb lrswipkxtecdan
anonymous p
aaa lrswipkxtecdan

From whatever imap client, when we search for new folders, user.bbb
appears, but neither user.bbb.mytest nor user.bbb.mytest.mysubtest.

This is the capture from imapd 3.0.6:

IMAP> 62 LIST "" "user/%"
IMAP< * LIST (\HasChildren) "/" user/bbb
IMAP< 62 OK Completed (0.001 secs 3 calls)
IMAP> 63 LIST "" "user/bbb/%"
IMAP< 63 OK Completed (0.000 secs)
IMAP> 64 LSUB "" "user/bbb/%"
IMAP< 64 OK Completed (0.000 secs)
IMAP> 65 LSUB "" "user/%"
IMAP< 65 OK Completed (0.000 secs)
IMAP> 66 LSUB "" "%"
IMAP< * LSUB (\Noselect \HasChildren) "/" INBOX
IMAP< 66 OK Completed (0.000 secs 4 calls)
IMAP> 16 NOOP
IMAP< 16 OK Success
IMAP> 67 SUBSCRIBE "user/bbb"
IMAP< 67 OK Completed
IMAP> 68 LSUB "" "%"
IMAP< * LSUB (\Noselect \HasChildren) "/" INBOX
IMAP< * LSUB (\Noselect \HasChildren) "/" user
IMAP< 68 OK Completed (0.001 secs 5 calls)
IMAP> 69 LSUB "" "INBOX/%"
IMAP< * LSUB () "/" INBOX/Drafts
...
IMAP> 74 LSUB "" "user/%"
IMAP< * LSUB () "/" user/bbb
IMAP< 74 OK Completed (0.001 secs 1 calls)
IMAP> 75 LSUB "" "user/bbb/%"
IMAP< 75 OK Completed (0.001 secs)

Refreshing only the user.bbb folders nothing changed

IMAP> 83 LIST "" "user/%"
IMAP< * LIST (\HasChildren) "/" user/bbb
IMAP< 83 OK Completed (0.001 secs 3 calls)
IMAP> 84 LIST "" "user/bbb/%"
IMAP< 84 OK Completed (0.001 secs)
IMAP> 85 LSUB "" "user/bbb/%"
IMAP< 85 OK Completed (0.001 secs)
IMAP> 86 LSUB "" "user/%"
IMAP< * LSUB () "/" user/bbb
IMAP< 86 OK Completed (0.001 secs 1 calls)

With net-mail/cyrus-imapd-2.4.17 all is working fine

imapd-2.4.17.conf attached

user.aaa 0 default aaa lrswipkxtecda anonymous p
user.bbb 0 default bbb lrswipkxtecda anonymous p
aaa lrswipkxtecda
user.bbb.mytest 0 default bbb lrswipkxtecda anonymous p
aaa lrswipkxtecda
user.bbb.mytest.mysubtest 0 default bbb lrswipkxtecda
anonymous p
aaa lrswipkxtecda

if we search for new folders to subscribe user/bbb and all the
subfolders appeared

IMAP> 57 LIST "" "user/%"
IMAP< * LIST (\HasChildren) "/" user/bbb
IMAP< 57 OK Completed (0.000 secs 3 calls)
IMAP> 58 LIST "" "user/bbb/%"
IMAP< * LIST (\HasChildren) "/" user/bbb/mytest
IMAP< 58 OK Completed (0.000 secs 2 calls)
IMAP> 59 LIST "" "user/bbb/mytest/%"
IMAP< * LIST (\HasNoChildren) "/" user/bbb/mytest/mysubtest
IMAP< 59 OK Completed (0.000 secs 2 calls)
IMAP> 60 LIST "" "user/bbb/mytest/mysubtest/%"
IMAP< 60 OK Completed (0.000 secs)
IMAP> 61 LSUB "" "user/bbb/mytest/mysubtest/%"
IMAP< 61 OK Completed (0.000 secs)
IMAP> 62 LSUB "" "user/bbb/mytest/%"
IMAP< 62 OK Completed (0.000 secs)
IMAP> 63 LSUB "" "user/bbb/%"
IMAP< 63 OK Completed (0.000 secs)
IMAP> 64 LSUB "" "user/%"
IMAP< 64 OK Completed (0.000 secs)
IMAP> 65 LSUB "" "%"
IMAP< * LSUB (\Noselect \HasChildren) "/" INBOX
IMAP< 65 OK Completed (0.000 secs 4 calls)
IMAP> 66 NOOP
IMAP< 66 OK Completed
IMAP> 67 SUBSCRIBE "user/bbb"
IMAP< 67 OK Completed
IMAP> 68 SUBSCRIBE "user/bbb/mytest/mysubtest"
IMAP< 68 OK Completed
IMAP> 69 SUBSCRIBE "user/bbb/mytest"
IMAP< 69 OK Completed

Any suggestion?

imapd-2.4.17.conf.txt
imapd-3.0.6.conf.txt

@elliefm
Copy link
Contributor

elliefm commented May 22, 2018

This is strange, it seems like it should work, from your config. Have you tried enabling telemetry for these users, and if so does it reveal anything that your captures haven't?

Does syslog report anything interesting during these IMAP sessions?

@neverexists
Copy link
Author

Hi,
i already tried but the logs are the same attached above, anyway here the telemetry log.
imap-4475.txt

There is nothing interesting reported by syslog.

@brong
Copy link
Member

brong commented May 22, 2018 via email

@elliefm
Copy link
Contributor

elliefm commented Jun 5, 2018

The following was submitted to the info-cyrus mailing list by Edda letters001@sendmaid.org:

Hi,

I was able to reproduce the issue with 3.0.5 with these settings:

unixhierarchysep: yes
altnamespace: no
crossdomains: no

Key factor is unixhierarchysep on. (crossdomains is a special case. altnamespace on/off only looks different.)

I did a lot of debugging and found out the following:

Compared to version 2.4.x and 2.5.x 3.0.x function list_data in ../imap/imapd.c does not transform the hierarchy separator.

In function mboxlist_do_find (../imap/mboxlist.c) below "Other Users namespace" we have a prefix search. With "unixhierarchysep on" cyrus uses the wrong prefix (domainpat) for that search.

Example:

. LIST "" "user/%"
* LIST (\HasChildren) "/" user/bbb
. OK Completed (0.000 secs 4 calls)
. LIST "" "user/bbb/sub01"
. OK Completed (0.000 secs)

In this case cyrus searches with domainpat: user.bbb/sub01/subsub01

The prefix is previously generated from a variable called commonpat, which is used only for this specific search.

So I fixed it there with this patch:

--- cyrus-imapd-3.0.5/imap/mboxlist.c.orig    2018-04-12 13:12:47.633956338 +0200
+++ cyrus-imapd-3.0.5/imap/mboxlist.c    2018-05-30 10:56:44.255724710 +0200
@@ -2774,6 +2774,10 @@
             const char *pat = strarray_nth(patterns, i);
             if (pat[prefixlen] != c) break;
         }
+        if (rock->namespace->hier_sep == '/') {
+            if (c == '/') c = '.';
+            else if (c == '.') c = DOTCHAR;
+        }
         if (i < patterns->count) break;
         if (c == '*' || c == '%' || c == '?') break;
         commonpat[prefixlen] = c;

Now for the example above the search pattern is user.bbb.sub01 and the submailbox is returned correctly.

. LIST "" "user/%"
* LIST (\HasChildren) "/" user/bbb
. OK Completed (0.000 secs 4 calls)
. LIST "" "user/bbb/sub01"
* LIST (\HasChildren) "/" user/bbb/sub01
. OK Completed (0.000 secs 2 calls)
. LIST "" "user/bbb/%"
* LIST (\HasChildren) "/" user/bbb/sub01
* LIST (\HasNoChildren) "/" user/bbb/sub.dot01
. OK Completed (0.000 secs 3 calls)
. SUBSCRIBE "user/bbb/sub01"
. OK Completed
. LSUB "" "user/*"
* LSUB () "/" user/bbb/sub01
. OK Completed (0.000 secs 1 calls)

The patch works fine in my test environment and I see no caveats yet. I would be very nice if someone could check it :-)

Best regards,
Edda

@elliefm elliefm self-assigned this Jun 5, 2018
@elliefm elliefm added the 3.0 affects 3.0 label Jun 5, 2018
elliefm added a commit to cyrusimap/cassandane that referenced this issue Jun 5, 2018
@elliefm elliefm added the 3.1 affects 3.1 dev releases label Jun 5, 2018
@elliefm
Copy link
Contributor

elliefm commented Jun 5, 2018

The above referenced Cassandane tests have confirmed that this issue also affects the master branch.

@elliefm
Copy link
Contributor

elliefm commented Jun 5, 2018

The patch looks good to me, applies cleanly to 3.0 and master and the tests pass. I'll wait for Edda's feedback on list wrt how they want to handle it (i.e. whether they want to submit a pull request, or if I should just manually commit it).

@dilyanpalauzov
Copy link
Contributor

dilyanpalauzov commented Jun 6, 2018

master has #define DOTCHAR '^' im imap/mboxname.h, in 3.0 DOTCHAR is not defined, so the change does not compile.

This turned out to be a false alarm: I have locally removed DOTCHAR, as it wasn't used anywhere.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.0 affects 3.0 3.1 affects 3.1 dev releases
Projects
None yet
Development

No branches or pull requests

4 participants