public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Commit
[DockerApi] rework doveadm__get_acl function
8e7b27aa
data/Dockerfiles/dockerapi/modules/DockerApi.py | 52 +++++++++++++++----------
data/web/inc/functions.mailbox.inc.php | 8 ++--
2 files changed, 35 insertions(+), 25 deletions(-)
Diff
diff --git a/data/Dockerfiles/dockerapi/modules/DockerApi.py b/data/Dockerfiles/dockerapi/modules/DockerApi.py
index da0cc34b..909ac287 100644
--- a/data/Dockerfiles/dockerapi/modules/DockerApi.py
+++ b/data/Dockerfiles/dockerapi/modules/DockerApi.py
@@ -412,35 +412,45 @@ class DockerApi:
sogo_return = container.exec_run(['sogo-tool', 'rename-user', old_username, new_username], user='sogo')
return self.exec_run_handler('generic', sogo_return)
- # api call: container_post - post_action: exec - cmd: dovecot - task: get_acl
- def container_post__exec__dovecot__get_acl(self, request_json, **kwargs):
+ # api call: container_post - post_action: exec - cmd: doveadm - task: get_acl
+ def container_post__exec__doveadm__get_acl(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
- vmail_name = request_json['maildir'].replace("'", "'\\''")
- shared_folders = container.exec_run(["/bin/bash", "-c", f"find /var/vmail/{vmail_name}/Maildir/Shared -mindepth 2 -type d | sed 's:^/var/vmail/{vmail_name}/Maildir/Shared/::' | tr '/' '\\\\'"])
+ id = request_json['id'].replace("'", "'\\''")
+
+ shared_folders = container.exec_run(["/bin/bash", "-c", f"doveadm mailbox list -u {id}"])
shared_folders = shared_folders.output.decode('utf-8')
+ shared_folders = shared_folders.splitlines()
+
formatted_acls = []
- if shared_folders:
- shared_folders = shared_folders.splitlines()
- for shared_folder in shared_folders:
- if "\\." not in shared_folder:
- continue
- shared_folder = shared_folder.split("\\.")
- acls = container.exec_run(["/bin/bash", "-c", f"doveadm acl get -u {shared_folder[0]} {shared_folder[1]}"])
- acls = acls.output.decode('utf-8').strip().splitlines()
- if len(acls) >= 2:
- for acl in acls[1:]:
- id, rights = acls[1].split(maxsplit=1)
- id = id.replace("user=", "")
- formatted_acls.append({ 'user': shared_folder[0], 'id': id, 'mailbox': shared_folder[1], 'rights': rights.split() })
+ mailbox_seen = []
+ for shared_folder in shared_folders:
+ if "Shared" not in shared_folder and "/" not in shared_folder:
+ continue
+ shared_folder = shared_folder.split("/")
+ if len(shared_folder) < 3:
+ continue
+
+ user = shared_folder[1]
+ mailbox = '/'.join(shared_folder[2:])
+ if mailbox in mailbox_seen:
+ continue
+
+ acls = container.exec_run(["/bin/bash", "-c", f"doveadm acl get -u {user} {mailbox}"])
+ acls = acls.output.decode('utf-8').strip().splitlines()
+ if len(acls) >= 2:
+ for acl in acls[1:]:
+ _, rights = acls[1].split(maxsplit=1)
+ mailbox_seen.append(mailbox)
+ formatted_acls.append({ 'user': user, 'id': id, 'mailbox': mailbox, 'rights': rights.split() })
return Response(content=json.dumps(formatted_acls, indent=4), media_type="application/json")
- # api call: container_post - post_action: exec - cmd: dovecot - task: delete_acl
- def container_post__exec__dovecot__delete_acl(self, request_json, **kwargs):
+ # api call: container_post - post_action: exec - cmd: doveadm - task: delete_acl
+ def container_post__exec__doveadm__delete_acl(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
@@ -454,8 +464,8 @@ class DockerApi:
if user and mailbox and id:
acl_delete_return = container.exec_run(["/bin/bash", "-c", f'doveadm acl delete -u {user} {mailbox} "user={id}"'])
return self.exec_run_handler('generic', acl_delete_return)
- # api call: container_post - post_action: exec - cmd: dovecot - task: set_acl
- def container_post__exec__dovecot__set_acl(self, request_json, **kwargs):
+ # api call: container_post - post_action: exec - cmd: doveadm - task: set_acl
+ def container_post__exec__doveadm__set_acl(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 762f233e..baf635dd 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -3249,15 +3249,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
// get imap acls
$exec_fields = array(
- 'cmd' => 'dovecot',
+ 'cmd' => 'doveadm',
'task' => 'get_acl',
- 'maildir' => $domain . '/' . $old_local_part,
+ 'id' => $old_username
);
$imap_acls = json_decode(docker('post', 'dovecot-mailcow', 'exec', $exec_fields), true);
// delete imap acls
foreach ($imap_acls as $imap_acl) {
$exec_fields = array(
- 'cmd' => 'dovecot',
+ 'cmd' => 'doveadm',
'task' => 'delete_acl',
'user' => $imap_acl['user'],
'mailbox' => $imap_acl['mailbox'],
@@ -3348,7 +3348,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
// set imap acls
foreach ($imap_acls as $imap_acl) {
$exec_fields = array(
- 'cmd' => 'dovecot',
+ 'cmd' => 'doveadm',
'task' => 'set_acl',
'user' => $imap_acl['user'],
'mailbox' => $imap_acl['mailbox'],