Hi all,
after configuring dovecot to serve private and Public Namespaces per
domain with ACLs per shared folder, everything worked great:
In every shared folder I created a "dovecot-acl"-file with the
permissions of every user:
user=user5@example.com
user=user6@example.com lrwstiea
The subscriptions are handled with "subscriptions=no", so every local
User can subscribe to shared folders as he likes. As the shared folders
are managed via webinterface, the cronjob creating and deleting the
folders also changes the subscriptions of every user, adding or removing
the public folders as permissions are granted.
RoundCube Webmail, Thunderbird and Outlook have no problems accessing
and using the public folders, but a customer has problems with his Mac:
In Apple Mail the folders are not visible, even when subscriptions are
previously set in another mailclient.
In RoundCube, I spottet another issue: subscribed public folders are
usable in the "Mail"-area, but no public folder is listed in the
"Folder"-settings - not even the already subscribed ones.
Setting "list=yes" to the public namespace, RC lists only the prefix
"shared" as a folder, but no subfolders - "list=children" shows no
folder at all.
As I checked the rawlog and debug-infos with "mail_debug=yes", I saw the
possible cause for my problems:
When checking the Folder Subscriptions in RoundCube, Dovecot tries to
find an ACL file for the public folders, but does not check the public
folders, but in the private Maildir:
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Loading modules from directory: /usr/lib/dovecot/modules/imap
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib01_acl_plugin.so
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib10_quota_plugin.so
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib11_imap_quota_plugin.so
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib20_autocreate_plugin.so
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib20_expire_plugin.so
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Effective uid=249, gid=249, home=/var/mail/vmail/example.com/user6/
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: No acl_shared_dict setting - shared mailbox listing is disabled
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota root: name=INBOX backend=dict args=:proxy::quotadict
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=INBOX mailbox=* bytes=52428800 messages=0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=INBOX mailbox=Trash bytes=62914560 messages=0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota warning: bytes=49807360 (95%) messages=0 command=/usr/local/bin/quota-warning.sh 95
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota warning: bytes=41943040 (80%) messages=0 command=/usr/local/bin/quota-warning.sh 80
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota root: name=shared backend=dict args=example.com:ns=shared.:proxy::quotadict
Oct 6 15:24:16 ipx02 dovecot: imap-login: Login: user=<user6@example.com>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=shared mailbox=* bytes=524288000 messages=0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): expire: pattern=Trash type=expunge secs=604800
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): expire: pattern=Spam type=expunge secs=2592000
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): dict quota: user=user6@example.com, uri=proxy::quotadict, noenforcing=0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): dict quota: user=example.com, uri=proxy::quotadict, noenforcing=0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Namespace: type=private, prefix=, sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): maildir: data=~/Maildir
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): maildir++: root=/var/mail/vmail/example.com/user6//Maildir, index=, control=, inbox=/var/mail/vmail/example.com/user6//Maildir
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: initializing backend with data: vfile
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: acl username = user6@example.com
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: owner = 1
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: Global ACL directory: (null)
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Namespace: type=public, prefix=shared., sep=., inbox=no, hidden=no, list=yes, subscriptions=no
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): maildir: data=/var/mail/vmail/example.com/shared:INDEX=~/shared
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): maildir++: root=/var/mail/vmail/example.com/shared, index=/var/mail/vmail/example.com/user6//shared, control=, inbox=
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: initializing backend with data: vfile
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: acl username = user6@example.com
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl: owner = 0
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: Global ACL directory: (null)
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Namespace : Using permissions from /var/mail/vmail/example.com/user6//Maildir: mode=0700 gid=-1
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: file /var/mail/vmail/example.com/user6//Maildir/.Sent/dovecot-acl not found
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: file /var/mail/vmail/example.com/user6//Maildir/.Spam/dovecot-acl not found
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: file /var/mail/vmail/example.com/user6//Maildir/.Trash/dovecot-acl not found
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: reading file /var/mail/vmail/example.com/user6//Maildir/dovecot-acl
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: file /var/mail/vmail/example.com/user6//Maildir/.shared.Transfer/dovecot-acl not found
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): acl vfile: file /var/mail/vmail/example.com/user6//Maildir/.shared.Transfer.Test1/dovecot-acl not found
Oct 6 15:24:16 ipx02 dovecot: IMAP(user6@example.com): Disconnected: Logged out bytes=73/819
(last three lines are important)
When checking the Folder itself, Dovecot checks in the IMHO correct folder:
Oct 6 15:25:02 ipx02 dovecot: imap-login: Login: user=<user6@example.com>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Loading modules from directory: /usr/lib/dovecot/modules/imap
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib01_acl_plugin.so
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib10_quota_plugin.so
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib11_imap_quota_plugin.so
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib20_autocreate_plugin.so
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Module loaded: /usr/lib/dovecot/modules/imap/lib20_expire_plugin.so
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Effective uid=249, gid=249, home=/var/mail/vmail/example.com/user6/
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: No acl_shared_dict setting - shared mailbox listing is disabled
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota root: name=INBOX backend=dict args=:proxy::quotadict
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=INBOX mailbox=* bytes=52428800 messages=0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=INBOX mailbox=Trash bytes=62914560 messages=0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota warning: bytes=49807360 (95%) messages=0 command=/usr/local/bin/quota-warning.sh 95
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota warning: bytes=41943040 (80%) messages=0 command=/usr/local/bin/quota-warning.sh 80
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota root: name=shared backend=dict args=example.com:ns=shared.:proxy::quotadict
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Quota rule: root=shared mailbox=* bytes=524288000 messages=0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): expire: pattern=Trash type=expunge secs=604800
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): expire: pattern=Spam type=expunge secs=2592000
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): dict quota: user=user6@example.com, uri=proxy::quotadict, noenforcing=0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): dict quota: user=example.com, uri=proxy::quotadict, noenforcing=0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Namespace: type=private, prefix=, sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): maildir: data=~/Maildir
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): maildir++: root=/var/mail/vmail/example.com/user6//Maildir, index=, control=, inbox=/var/mail/vmail/example.com/user6//Maildir
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: initializing backend with data: vfile
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: acl username = user6@example.com
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: owner = 1
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl vfile: Global ACL directory: (null)
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Namespace: type=public, prefix=shared., sep=., inbox=no, hidden=no, list=yes, subscriptions=no
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): maildir: data=/var/mail/vmail/example.com/shared:INDEX=~/shared
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): maildir++: root=/var/mail/vmail/example.com/shared, index=/var/mail/vmail/example.com/user6//shared, control=, inbox=
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: initializing backend with data: vfile
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: acl username = user6@example.com
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl: owner = 0
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): acl vfile: Global ACL directory: (null)
Oct 6 15:25:02 ipx02 dovecot: IMAP(user6@example.com): Namespace : Using permissions from /var/mail/vmail/example.com/user6//Maildir: mode=0700 gid=-1
Oct 6 15:25:03 ipx02 dovecot: IMAP(user6@example.com): acl vfile: reading file /var/mail/vmail/example.com/shared/.Transfer.Test1/dovecot-acl
Oct 6 15:25:03 ipx02 dovecot: IMAP(user6@example.com): expire: No expiring in mailbox: shared.Transfer.Test1
Oct 6 15:25:03 ipx02 dovecot: IMAP(user6@example.com): Disconnected: Logged out bytes=85/743
(last four lines are important)
Is this a possible bug related to ACL and Public Namespaces, or do I
have to create the public folders also in the local Maildir and symlink
the dovecot-acl to the public folder?
With the symlinks in place (per Folder), dovecot finds the ACL-files and
lists the folders also in RoundCube's "Folder"-pane and Apple Mail finds
the public folders too.
Upgrading to 1.2.5 failed so far, as my build-server has problems with
automake, have to look into this too.
Thanks in advance!
best regards,
Anton Dollmaier
Output of dovecot -n:
# 1.2.3: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.18-6-686 i686 Debian 5.0.3
log_timestamp: %Y-%m-%d %H:%M:%S
protocols: imap imaps pop3s pop3
listen: *, [::]
ssl_cert_file: /etc/dovecot/dovecot.pem
ssl_key_file: /etc/dovecot/dovecot.pem
disable_plaintext_auth: no
login_dir: /var/run/dovecot/login
login_executable(default): /usr/lib/dovecot/imap-login
login_executable(imap): /usr/lib/dovecot/imap-login
login_executable(pop3): /usr/lib/dovecot/pop3-login
mail_max_userip_connections(default): 25
mail_max_userip_connections(imap): 25
mail_max_userip_connections(pop3): 10
first_valid_uid: 249
mail_access_groups: poponly
mail_privileged_group: poponly
mail_location: maildir:~/Maildir
mail_debug: yes
mail_executable(default): /usr/lib/dovecot/rawlog /usr/lib/dovecot/imap
mail_executable(imap): /usr/lib/dovecot/rawlog /usr/lib/dovecot/imap
mail_executable(pop3): /usr/lib/dovecot/pop3
mail_plugins(default): quota imap_quota acl autocreate expire
mail_plugins(imap): quota imap_quota acl autocreate expire
mail_plugins(pop3): quota expire
mail_plugin_dir(defamiult): /usr/lib/dovecot/modules/imap
mail_plugin_dir(imap): /usr/lib/dovecot/modules/imap
mail_plugin_dir(pop3): /usr/lib/dovecot/modules/pop3
imap_client_workarounds(default): netscape-eoh
imap_client_workarounds(imap): netscape-eoh
imap_client_workarounds(pop3):
pop3_client_workarounds(default):
pop3_client_workarounds(imap):
pop3_client_workarounds(pop3): outlook-no-nuls oe-ns-eoh
namespace:
type: private
separator: .
inbox: yes
list: yes
subscriptions: yes
namespace:
type: public
separator: .
prefix: shared.
location: maildir:/var/mail/vmail/%d/shared:INDEX=~/shared
list: yes
lda:
postmaster_address: postmaster@server.example.com
mail_plugins: quota expire
quota_full_tempfail: yes
auth_socket_path: /var/run/dovecot/auth-master
log_path: /var/log/dovecot-deliver.log
info_log_path: /var/log/dovecot-deliver.log
sieve_global_dir: /etc/dovecot/sieve/
sieve_global_path: /etc/dovecot/default.sieve
auth default:
mechanisms: plain login
passdb:
driver: sql
args: /etc/dovecot/dovecot-sql.conf
passdb:
driver: sql
args: /etc/dovecot/dovecot-sql-master.conf
userdb:
driver: sql
args: /etc/dovecot/dovecot-sql.conf
socket:
type: listen
client:
path: /var/spool/postfix/private/auth
mode: 432
user: postfix
group: postfix
master:
path: /var/run/dovecot/auth-master
mode: 432
user: vmail
group: vmail
plugin:
quota: dict:INBOX::proxy::quotadict
quota2: dict:shared:%d:ns=shared.:proxy::quotadict
quota_rule: *:storage=50M:messages=1000
quota_rule2: Trash:storage=50M:messages=100
quota2_rule: *:storage=100M:messages=1000
quota_warning: storage=95%% /usr/local/bin/quota-warning.sh 95
quota_warning2: storage=80%% /usr/local/bin/quota-warning.sh 80
acl: vfile
expire: Trash 7 Spam 30
expire_dict: proxy::expire
autocreate: Trash
autocreate2: Spam
autocreate3: Sent
autosubscribe: Trash
autosubscribe2: Spam
autosubscribe3: Sent
dict:
quotadict: mysql:/etc/dovecot/dovecot-dict-quota.conf
expire: mysql:/etc/dovecot/dovecot-dict-expire.conf