blob: c5aaa25649a6d351ff36d8cf7c7b5c39bdcfa8fe (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
|