Dovecotで、他人と同じメールフォルダを共有する設定を追加してみます。 ユーザのいないフォルダを全員で共有するケースと、個人のフォルダを誰かに共有するケースの2つを設定してみます。
 
 
1. パブリック共有のケース 
こちらはユーザのフォルダを他ユーザに見せるのではなく、全員が見れるような共有フォルダを作成します。
 
まずは、誰でもメールを置いたり削除したり出来る最小限の構成を作って見ます。
 
# default側はseparatorを追加するだけ
namespace inbox {
  separator = /
  # ...
}
# add public
namespace {
  type = public
  # should use the same separator for all
  separator = /
  prefix = Public/
  location = maildir:/var/mail/public
  subscriptions = no
}
public用フォルダをmkdirします。ついでにtestフォルダも作成。
mkdir /var/mail/public/
mkdir /var/mail/public/.test
chown -R vmb.vmb /var/mail/public 
これでdovecotリロード後、RoundCubeにログインして、設定>フォルダを見るとPublic/testが追加されています。
 
 
※Public自体にメールは置けませんので、その下にフォルダを作り置きます。誰かがメールを置けば見れるし、削除すれば消えるし、閲覧すれば全員が閲覧済となります。
 
1-1. 一般ユーザは閲覧のみ可能にする 
次にユーザは閲覧のみで、管理者を一人設定してそのユーザにメールを置いたりする権限を与えるようにACLを設定してみます。
 
 
mail_plugins = $mail_plugins acl 
plugin {
  acl = vfile:/etc/dovecot/global-acls:cache_secs=300
  # (v2.2.31+)
  #acl_globals_only = yes
} 
Public/* anyone lrs
Public user=aikawa@virtual.localdomain lrswtipekxa
Public/* user=aikawa@virtual.localdomain lrswtipekxa 
これでPublic下のフォルダは、誰でも閲覧可能、aikawa@virtual.localdomainが管理者としてフォルダの作成やメールを設置したり出来るようになりました。 acl_globals_onlyは今回設定しませんので、ユーザのフォルダごとにdovecot-acl設置も可能です。
 
ついでに、閲覧について個人ごとに既読・未読を切り替えられるようにします。 conf.d/10-mail.conf のnamespace{type=public}のlocationに、オプションを設定します。 ※Dovecot 2.3以降はINDEXPVTを設定する事で、そこに閲覧フラグの管理ファイルを設置出来ます。
 
  location = maildir:/var/mail/public:CONTROL=~/Maildir/public:INDEXPVT=~/Maildir/public 
1-2. RoundCubeのACLプラグイン 
RoundCubeでもaclプラグインを有効にしてみます。
 
protocol imap {
 mail_plugins = $mail_plugins imap_acl
}
RoundCube側のroundcube/config/config.inc.phpでaclを追加します。
$config['plugins'] = ['acl'];
再度ログインし直して、設定>フォルダでPublicを見ると、一般ユーザは以下のように表示されます。
管理者aikawa@virtual.localdomainでは、権限の編集とフォルダの作成が可能になっています。
Public/testフォルダはglobalで設定した内容が反映されています。
 
2. ユーザ間のメール共有 
こちらはユーザ間で、指定ユーザのメールを閲覧可能にしてみます。 (ユーザ間の方はファイルの書き方とか記載の無い所が多くて、調べて行くのが面倒でした。Publicの方が使いやすいし楽だし、ほぼ使わないんじゃないかと思います)
 
# default側はseparatorを追加するだけ
namespace inbox {
  separator = /
  # ...
}
# add shared
namespace {
  type = shared
  separator = /
  prefix = shared/%%n/
  location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%n:INDEXPVT=~/Maildir/shared/%%n
  subscriptions = no
  list = children
}
# virtual mailbox owner
mail_access_groups = vmb 
protocol imap {
 mail_plugins = $mail_plugins imap_acl
} 
plugin {
  acl = vfile:/etc/dovecot/global-acls:cache_secs=300
}
plugin {
  # vmb can access
  acl_shared_dict = file:/var/mail/shared/shared-mailboxes
} 
shared/* anyone lrs 
acl_shared_dict のファイル /var/mail/shared/shared-mailboxes を作成します。
mkdir /var/mail/shared
touch /var/mail/shared/shared-mailboxes
chown -R vmb.vmb /var/mail/shared
この時点で、各ユーザのMaildir/subscriptionsにshared/username を追加する事で閲覧出来るのですが、フォルダー一覧には出ず、ほぼ実質閲覧が不可能なため、追加設定が必要です。
 
 
/var/mail/shared/shared-mailboxes 
 
1設定につき2行構成で、1行目はユーザ、2行目はフラグを記載するようです。
ユーザ個別に閲覧させる場合、shared/shared-boxes/user/$to/$from の形式で記載します。
2行目は1固定のようですが、割と他の文字列でも有効フラグ扱いになるようです。
shared/shared-boxes/user/user1@virtual.localdomain/aikawa@virtual.localdomain
1
上記ではaikawa@virtual.localdomainのフォルダをuser1@virtual.localdomainが閲覧可能になります。
あるユーザを全員に閲覧させる場合、shared/shared-boxes/anyone/$from の形式で記載します。
shared/shared-boxes/user/user1@virtual.localdomain/aikawa@virtual.localdomain
1
shared/shared-boxes/anyone/test@virtual.localdomain
1
これで全員がtest@virtual.localdomainを閲覧可能になります。
user1@virtual.localdomainから見た場合
他のユーザ(test@virtual.localdomain以外)から見た場合
 
2-1. SQLで管理する 
共有するユーザをファイルでなくSQLで管理してみます。
plugin {
  acl_shared_dict = proxy::acl
}
dict {
  acl = pgsql:/usr/local/etc/dovecot/dovecot-dict-shared-sql.conf.ext
} 
/usr/local/etc/dovecot/dovecot-dict-shared.sql.conf.ext 
 
connect = host=localhost user=mail password=testpass dbname=mail
map {
  pattern = shared/shared-boxes/user/$to/$from
  table = user_shares
  value_field = dummy
  fields {
    from_user = $from
    to_user = $to
  }
}
map {
  pattern = shared/shared-boxes/anyone/$from
  table = anyone_shares
  value_field = dummy
  fields {
    from_user = $from
  }
}
テーブルを作成します。
CREATE TABLE user_shares (
  from_user varchar(100) not null,
  to_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user, to_user)
);
COMMENT ON TABLE user_shares IS 'User from_user shares folders to user to_user.';
CREATE INDEX to_user ON user_shares (to_user); -- because we always search for to_user
CREATE TABLE anyone_shares (
  from_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user)
);
COMMENT ON TABLE anyone_shares IS 'User from_user shares folders to anyone.';
先ほどのファイルと同じ設定の場合、INSERTは以下になります。
INSERT INTO user_shares(from_user, to_user) VALUES('aikawa@virtual.localdomain', 'user1@virtual.localdomain');
INSERT INTO anyone_shares(from_user) VALUES('test@virtual.localdomain'); 
 
												
						
							
															この投稿は  2023年3月9日 木曜日 17:10 に 未分類  カテゴリーに公開されました。							この投稿へのコメントは RSS 2.0  フィードで購読することができます。 
														現在コメント、トラックバックともに受け付けておりません。