1
0
mirror of https://github.com/mailcow/mailcow-dockerized.git synced 2025-12-21 05:41:31 +00:00

[DockerApi] Fix IMAP ACL migration issue when renaming mailbox

This commit is contained in:
FreddleSpl0it
2024-10-31 11:00:03 +01:00
parent 2d76ffc88c
commit d8c8e4ab1b
2 changed files with 34 additions and 18 deletions

View File

@@ -429,8 +429,20 @@ class DockerApi:
formatted_acls = [] formatted_acls = []
mailbox_seen = [] mailbox_seen = []
for shared_folder in shared_folders: for shared_folder in shared_folders:
if "Shared" not in shared_folder and "/" not in shared_folder: if "Shared" not in shared_folder:
mailbox = shared_folder.replace("'", "'\\''")
if mailbox in mailbox_seen:
continue continue
acls = container.exec_run(["/bin/bash", "-c", f"doveadm acl get -u '{id}' '{mailbox}'"])
acls = acls.output.decode('utf-8').strip().splitlines()
if len(acls) >= 2:
for acl in acls[1:]:
user_id, rights = acl.split(maxsplit=1)
user_id = user_id.split('=')[1]
mailbox_seen.append(mailbox)
formatted_acls.append({ 'user': id, 'id': user_id, 'mailbox': mailbox, 'rights': rights.split() })
elif "Shared" in shared_folder and "/" in shared_folder:
shared_folder = shared_folder.split("/") shared_folder = shared_folder.split("/")
if len(shared_folder) < 3: if len(shared_folder) < 3:
continue continue
@@ -444,7 +456,9 @@ class DockerApi:
acls = acls.output.decode('utf-8').strip().splitlines() acls = acls.output.decode('utf-8').strip().splitlines()
if len(acls) >= 2: if len(acls) >= 2:
for acl in acls[1:]: for acl in acls[1:]:
_, rights = acls[1].split(maxsplit=1) user_id, rights = acl.split(maxsplit=1)
user_id = user_id.split('=')[1].replace("'", "'\\''")
if user_id == id and mailbox not in mailbox_seen:
mailbox_seen.append(mailbox) mailbox_seen.append(mailbox)
formatted_acls.append({ 'user': user, 'id': id, 'mailbox': mailbox, 'rights': rights.split() }) formatted_acls.append({ 'user': user, 'id': id, 'mailbox': mailbox, 'rights': rights.split() })

View File

@@ -3364,12 +3364,14 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
// set imap acls // set imap acls
foreach ($imap_acls as $imap_acl) { foreach ($imap_acls as $imap_acl) {
$user_id = ($imap_acl['id'] == $old_username) ? $new_username : $imap_acl['id'];
$user = ($imap_acl['user'] == $old_username) ? $new_username : $imap_acl['user'];
$exec_fields = array( $exec_fields = array(
'cmd' => 'doveadm', 'cmd' => 'doveadm',
'task' => 'set_acl', 'task' => 'set_acl',
'user' => $imap_acl['user'], 'user' => $user,
'mailbox' => $imap_acl['mailbox'], 'mailbox' => $imap_acl['mailbox'],
'id' => $new_username, 'id' => $user_id,
'rights' => $imap_acl['rights'] 'rights' => $imap_acl['rights']
); );
docker('post', 'dovecot-mailcow', 'exec', $exec_fields); docker('post', 'dovecot-mailcow', 'exec', $exec_fields);