diff options
Diffstat (limited to 'src/plugins/acl/acl-backend-vfile.h')
-rw-r--r-- | src/plugins/acl/acl-backend-vfile.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/plugins/acl/acl-backend-vfile.h b/src/plugins/acl/acl-backend-vfile.h new file mode 100644 index 0000000..c5aaa25 --- /dev/null +++ b/src/plugins/acl/acl-backend-vfile.h @@ -0,0 +1,88 @@ +#ifndef ACL_BACKEND_VFILE_H +#define ACL_BACKEND_VFILE_H + +#include "acl-api-private.h" +#include "mail-storage-private.h" + +#define ACL_FILENAME "dovecot-acl" +#define ACLLIST_FILENAME "dovecot-acl-list" + +#define ACL_VFILE_VALIDITY_MTIME_NOTFOUND 0 +#define ACL_VFILE_VALIDITY_MTIME_NOACCESS -1 + +struct acl_vfile_validity { + time_t last_check; + + time_t last_read_time; + time_t last_mtime; + off_t last_size; +}; + +struct acl_backend_vfile_validity { + struct acl_vfile_validity global_validity, local_validity; +}; + +struct acl_object_vfile { + struct acl_object aclobj; + + /* if backend->global_file is NULL, assume legacy separate global + ACL file per mailbox */ + char *global_path, *local_path; +}; + +struct acl_backend_vfile_acllist { + time_t mtime; + const char *name; +}; + +struct acl_backend_vfile { + struct acl_backend backend; + const char *global_path; + + pool_t acllist_pool; + ARRAY(struct acl_backend_vfile_acllist) acllist; + + time_t acllist_last_check; + time_t acllist_mtime; + unsigned int acllist_change_counter; + + unsigned int cache_secs; + bool rebuilding_acllist:1; + bool iterating_acllist:1; +}; + +void acl_vfile_write_rights_list(string_t *dest, const char *const *rights); +int acl_backend_vfile_object_update(struct acl_object *aclobj, + const struct acl_rights_update *update); + +void acl_backend_vfile_acllist_refresh(struct acl_backend_vfile *backend); +int acl_backend_vfile_acllist_rebuild(struct acl_backend_vfile *backend); +void acl_backend_vfile_acllist_verify(struct acl_backend_vfile *backend, + const char *name, time_t mtime); + +struct acl_mailbox_list_context * +acl_backend_vfile_nonowner_iter_init(struct acl_backend *backend); +bool acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *ctx, + const char **name_r); +int +acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx); +int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *backend); + +int acl_backend_vfile_object_get_mtime(struct acl_object *aclobj, + time_t *mtime_r); + +static inline enum mailbox_list_path_type +mail_storage_get_acl_list_path_type(struct mail_storage *storage) +{ + if (mail_storage_is_mailbox_file(storage)) { + /* mailbox is a directory (e.g. mbox) */ + return MAILBOX_LIST_PATH_TYPE_CONTROL; + } + if ((storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0) { + /* there is no local mailbox directory */ + return MAILBOX_LIST_PATH_TYPE_CONTROL; + } + return MAILBOX_LIST_PATH_TYPE_MAILBOX; +} + +#endif |