]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
plugins: acl - Support loading ACLs directly from config
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Nov 2023 11:55:07 +0000 (13:55 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
Allows setting global, per-namespace and per-mailbox ACLs.

src/plugins/acl/acl-api-private.h
src/plugins/acl/acl-backend-vfile.c
src/plugins/acl/acl-backend.c

index 1a6fb27d3d544a2a49be1576ce02d846a639207e..65073daf1dbbd3156f7e7c85882821133cd6d1b2 100644 (file)
@@ -102,6 +102,9 @@ void acl_object_rebuild_cache(struct acl_object *aclobj);
 void acl_object_remove_all_access(struct acl_object *aclobj);
 void acl_object_add_global_acls(struct acl_object *aclobj);
 
+int acl_backend_get_mailbox_acl(struct acl_backend *backend,
+                               struct acl_object *aclobj);
+
 void acl_backend_register(const struct acl_backend_vfuncs *v);
 void acl_backend_unregister(const char *name);
 
index 193928230fe6c336f6312aa47ee58f12c0ffc0d7..b6aafc2ba341d758b92a32efa26a3e6f3516e812 100644 (file)
@@ -500,6 +500,10 @@ static int acl_backend_vfile_object_refresh_cache(struct acl_object *_aclobj)
                validity.global_validity.last_mtime = st.st_mtime;
                validity.global_validity.last_size = st.st_size;
        }
+
+       if (acl_backend_get_mailbox_acl(_aclobj->backend, _aclobj) < 0)
+               return -1;
+
        if (acl_backend_vfile_read_with_retry(_aclobj, aclobj->local_path,
                                              &validity.local_validity) < 0)
                return -1;
index 1ab639e83c07a06827122cc9b1e18dc0c69ec13a..0aff001951b698d76aa75c3a528915bf9091bbb9 100644 (file)
@@ -8,6 +8,7 @@
 #include "settings.h"
 #include "mail-storage-settings.h"
 #include "mailbox-list-private.h"
+#include "mail-storage-private.h"
 #include "mail-namespace.h"
 #include "mail-user.h"
 #include "acl-cache.h"
@@ -219,6 +220,48 @@ int acl_backend_get_default_rights(struct acl_backend *backend,
        return 0;
 }
 
+int acl_backend_get_mailbox_acl(struct acl_backend *backend, struct acl_object *aclobj)
+{
+       const char *error;
+       if (!mailbox_list_is_valid_name(backend->list, aclobj->name, &error)) {
+               e_debug(backend->event, "'%s' is not a valid mailbox name: %s",
+                       aclobj->name, error);
+               return 0;
+       }
+
+       const char *vname = mailbox_list_get_vname(backend->list, aclobj->name);
+       struct event *event =
+               mail_storage_mailbox_create_event(backend->event, backend->list,
+                                                 vname);
+       struct acl_settings *aset;
+       const char *aname;
+       int ret;
+
+       if ((ret = settings_get(event, &acl_setting_parser_info, 0,
+                               &aset, &error)) < 0) {
+               e_error(event, "%s", error);
+       } else if (array_is_created(&aset->acl_rights)) {
+               array_foreach_elem(&aset->acl_rights, aname) {
+                       struct acl_rights_settings *rset;
+                       if ((ret = settings_get_filter(event, "acl", aname,
+                                                      &acl_rights_setting_parser_info,
+                                                      0, &rset, &error)) < 0) {
+                               e_error(event, "%s", error);
+                               break;
+                       }
+
+                       struct acl_rights *right = array_append_space(&aclobj->rights);
+                       e_debug(event, "Using configured acl '%s'", rset->id);
+                       acl_rights_dup(rset->parsed, aclobj->rights_pool, right);
+                       settings_free(rset);
+               }
+       }
+
+       settings_free(aset);
+       event_unref(&event);
+       return ret < 0 ? -1 : 0;
+}
+
 void acl_backend_register(const struct acl_backend_vfuncs *v)
 {
        struct acl_backend_entry *be = i_new(struct acl_backend_entry, 1);