Mercurial > dovecot > core-2.2
annotate src/plugins/acl/acl-backend-vfile-acllist.c @ 12777:988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 04 Mar 2011 18:08:30 +0200 |
parents | 82f984d7a241 |
children | 447bce266022 |
rev | line source |
---|---|
10582
615eef3139c2
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
10000
diff
changeset
|
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */ |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "safe-mkstemp.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "istream.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ostream.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mail-namespace.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "mail-storage.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "acl-plugin.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "acl-cache.h" |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8430
diff
changeset
|
13 #include "acl-lookup-dict.h" |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "acl-backend-vfile.h" |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include <stdio.h> |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include <unistd.h> |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <fcntl.h> |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <sys/stat.h> |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct acl_mailbox_list_context_vfile { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct acl_mailbox_list_context ctx; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 unsigned int idx; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 }; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 static void |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 acllist_clear(struct acl_backend_vfile *backend, uoff_t file_size) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 if (backend->acllist_pool == NULL) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 backend->acllist_pool = |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 pool_alloconly_create("vfile acllist", |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 I_MAX(file_size / 2, 128)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 i_array_init(&backend->acllist, I_MAX(16, file_size / 60)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } else { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 p_clear(backend->acllist_pool); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 array_clear(&backend->acllist); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
41 static const char *acl_list_get_root_dir(struct acl_backend_vfile *backend) |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
42 { |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
43 struct mail_storage *storage; |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
44 const char *rootdir, *maildir; |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
45 |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
46 rootdir = mailbox_list_get_path(backend->backend.list, NULL, |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
47 MAILBOX_LIST_PATH_TYPE_DIR); |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
48 |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
49 storage = mailbox_list_get_namespace(backend->backend.list)->storage; |
9601 | 50 if (mail_storage_is_mailbox_file(storage)) { |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
51 maildir = mailbox_list_get_path(backend->backend.list, NULL, |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
52 MAILBOX_LIST_PATH_TYPE_MAILBOX); |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
53 if (strcmp(maildir, rootdir) == 0) { |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
54 /* dovecot-acl-list would show up as a mailbox if we |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
55 created it to root dir. since we don't really have |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
56 any other good alternatives, place it to control |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
57 dir */ |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
58 rootdir = mailbox_list_get_path(backend->backend.list, |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
59 NULL, MAILBOX_LIST_PATH_TYPE_CONTROL); |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
60 } |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
61 } |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
62 return rootdir; |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
63 } |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
64 |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
65 static const char *acl_list_get_path(struct acl_backend_vfile *backend) |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
66 { |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
67 return t_strconcat(acl_list_get_root_dir(backend), |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
68 "/"ACLLIST_FILENAME, NULL); |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
69 } |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
70 |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 static int acl_backend_vfile_acllist_read(struct acl_backend_vfile *backend) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 struct acl_backend_vfile_acllist acllist; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 struct istream *input; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 struct stat st; |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
76 const char *path, *line, *p; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 int fd, ret = 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 backend->acllist_last_check = ioloop_time; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
81 path = acl_list_get_path(backend); |
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
82 if (path == NULL) { |
8212 | 83 /* we're never going to build acllist for this namespace. */ |
84 i_array_init(&backend->acllist, 1); | |
85 return 0; | |
86 } | |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (backend->acllist_mtime != 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 /* see if the file's mtime has changed */ |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 if (stat(path, &st) < 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 if (errno == ENOENT) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 backend->acllist_mtime = 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 else |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 i_error("stat(%s) failed: %m", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 return -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 if (st.st_mtime == backend->acllist_mtime) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 return 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 fd = open(path, O_RDONLY); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 if (fd == -1) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (errno == ENOENT) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 backend->acllist_mtime = 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 return -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 i_error("open(%s) failed: %m", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 return -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 if (fstat(fd, &st) < 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 i_error("fstat(%s) failed: %m", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 (void)close(fd); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 return -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 backend->acllist_mtime = st.st_mtime; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 acllist_clear(backend, st.st_size); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 |
6162
896cc473c1f0
Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
118 input = i_stream_create_fd(fd, (size_t)-1, FALSE); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 while ((line = i_stream_read_next_line(input)) != NULL) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 acllist.mtime = 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 for (p = line; *p >= '0' && *p <= '9'; p++) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 acllist.mtime = acllist.mtime * 10 + (*p - '0'); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 if (p == line || *p != ' ' || p[1] == '\0') { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 i_error("Broken acllist file: %s", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 if (unlink(path) < 0 && errno != ENOENT) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 i_error("unlink(%s) failed: %m", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 return -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 acllist.name = p_strdup(backend->acllist_pool, p + 1); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 array_append(&backend->acllist, &acllist, 1); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 if (input->stream_errno != 0) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 i_stream_destroy(&input); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 if (close(fd) < 0) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 i_error("close(%s) failed: %m", path); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 return ret; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 void acl_backend_vfile_acllist_refresh(struct acl_backend_vfile *backend) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 { |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
144 i_assert(!backend->iterating_acllist); |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
145 |
5983 | 146 if (backend->acllist_last_check + |
147 (time_t)backend->cache_secs > ioloop_time) | |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 return; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 if (acl_backend_vfile_acllist_read(backend) < 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 acllist_clear(backend, 0); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 if (!backend->rebuilding_acllist) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 (void)acl_backend_vfile_acllist_rebuild(backend); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 static int |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 acllist_append(struct acl_backend_vfile *backend, struct ostream *output, |
11576
99d56a37edd0
mailbox list iter: Require MAILBOX_LIST_ITER_VIRTUAL_NAMES flag.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
159 const char *vname) |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 struct acl_object *aclobj; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 struct acl_object_list_iter *iter; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 struct acl_rights rights; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 struct acl_backend_vfile_acllist acllist; |
11576
99d56a37edd0
mailbox list iter: Require MAILBOX_LIST_ITER_VIRTUAL_NAMES flag.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
165 const char *name; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 int ret; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
12586
a2780b694b2d
lib-storage: mailbox_alloc() now takes a virtual mailbox name and other related API changes.
Timo Sirainen <tss@iki.fi>
parents:
12538
diff
changeset
|
168 name = mailbox_list_get_storage_name(backend->backend.list, vname); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 acl_cache_flush(backend->backend.cache, name); |
9434
e374a365521d
Initial commit for making mail_storage:mailbox_list to be from 1:1 to n:n.
Timo Sirainen <tss@iki.fi>
parents:
8901
diff
changeset
|
170 aclobj = acl_object_init_from_name(&backend->backend, name); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 iter = acl_object_list_init(aclobj); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 while ((ret = acl_object_list_next(iter, &rights)) > 0) { |
8430
23aee2534249
acl: When lookup ACLs are changed, make sure dovecot-acl-list is updated.
Timo Sirainen <tss@iki.fi>
parents:
8212
diff
changeset
|
174 if (acl_rights_has_nonowner_lookup_changes(&rights)) |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 break; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 acl_object_list_deinit(&iter); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (acl_backend_vfile_object_get_mtime(aclobj, &acllist.mtime) < 0) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 if (ret > 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 acllist.name = p_strdup(backend->acllist_pool, name); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 array_append(&backend->acllist, &acllist, 1); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
186 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6774
diff
changeset
|
187 const char *line; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6774
diff
changeset
|
188 line = t_strdup_printf("%s %s\n", |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6774
diff
changeset
|
189 dec2str(acllist.mtime), name); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6774
diff
changeset
|
190 o_stream_send_str(output, line); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
191 } T_END; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 acl_object_deinit(&aclobj); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 return ret < 0 ? -1 : 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 |
9506
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
197 static int |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
198 acl_backend_vfile_acllist_try_rebuild(struct acl_backend_vfile *backend) |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 struct mailbox_list *list = backend->backend.list; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 struct mail_namespace *ns; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 struct mailbox_list_iterate_context *iter; |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5552
diff
changeset
|
203 const struct mailbox_info *info; |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
204 const char *rootdir, *origin, *acllist_path; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 struct ostream *output; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 struct stat st; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 string_t *path; |
12630
82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
Timo Sirainen <tss@iki.fi>
parents:
12586
diff
changeset
|
208 mode_t file_mode, dir_mode; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 gid_t gid; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 int fd, ret; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
212 i_assert(!backend->rebuilding_acllist); |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
213 |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
214 rootdir = acl_list_get_root_dir(backend); |
8212 | 215 if (rootdir == NULL) |
216 return 0; | |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 |
8901
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
218 ns = mailbox_list_get_namespace(list); |
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
219 if ((ns->flags & NAMESPACE_FLAG_UNUSABLE) != 0) { |
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
220 /* we can't write anything here */ |
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
221 return 0; |
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
222 } |
703214a10642
acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8896
diff
changeset
|
223 |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 path = t_str_new(256); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 str_printfa(path, "%s/%s", rootdir, mailbox_list_get_temp_prefix(list)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 /* Build it into a temporary file and rename() over. There's no need |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 to use locking, because even if multiple processes are rebuilding |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 the file at the same time the result should be the same. */ |
12630
82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
Timo Sirainen <tss@iki.fi>
parents:
12586
diff
changeset
|
230 mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, |
82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
Timo Sirainen <tss@iki.fi>
parents:
12586
diff
changeset
|
231 &gid, &origin); |
82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
Timo Sirainen <tss@iki.fi>
parents:
12586
diff
changeset
|
232 fd = safe_mkstemp_group(path, file_mode, gid, origin); |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
233 if (fd == -1 && errno == ENOENT) { |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
234 if (mailbox_list_create_parent_dir(backend->backend.list, NULL, |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
235 str_c(path)) < 0) |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
236 return -1; |
12630
82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
Timo Sirainen <tss@iki.fi>
parents:
12586
diff
changeset
|
237 fd = safe_mkstemp_group(path, file_mode, gid, origin); |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
238 } |
6774
532b29891022
Log error if safe_mkstemp() fails
Timo Sirainen <tss@iki.fi>
parents:
6773
diff
changeset
|
239 if (fd == -1) { |
7428
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
240 if (errno == EACCES) { |
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
241 /* Ignore silently if we can't create it */ |
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
242 return 0; |
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
243 } |
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
244 i_error("dovecot-acl-list creation failed: " |
d6f1eb00e4d3
If dovecot-acl-list can't be created because of permission problems, it's
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
245 "safe_mkstemp(%s) failed: %m", str_c(path)); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 return -1; |
6774
532b29891022
Log error if safe_mkstemp() fails
Timo Sirainen <tss@iki.fi>
parents:
6773
diff
changeset
|
247 } |
6161
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
248 output = o_stream_create_fd_file(fd, 0, FALSE); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 ret = 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 acllist_clear(backend, 0); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 backend->rebuilding_acllist = TRUE; |
11576
99d56a37edd0
mailbox list iter: Require MAILBOX_LIST_ITER_VIRTUAL_NAMES flag.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
254 iter = mailbox_list_iter_init(list, "*", |
99d56a37edd0
mailbox list iter: Require MAILBOX_LIST_ITER_VIRTUAL_NAMES flag.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
255 MAILBOX_LIST_ITER_RAW_LIST | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
256 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 while ((info = mailbox_list_iter_next(iter)) != NULL) { |
9434
e374a365521d
Initial commit for making mail_storage:mailbox_list to be from 1:1 to n:n.
Timo Sirainen <tss@iki.fi>
parents:
8901
diff
changeset
|
258 if (acllist_append(backend, output, info->name) < 0) { |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 break; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 |
9506
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
264 if (output->stream_errno != 0) { |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
265 i_error("write(%s) failed: %m", str_c(path)); |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
266 ret = -1; |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
267 } |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 if (mailbox_list_iter_deinit(&iter) < 0) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 o_stream_destroy(&output); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 if (ret == 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 if (fstat(fd, &st) < 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 i_error("fstat(%s) failed: %m", str_c(path)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 if (close(fd) < 0) { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 i_error("close(%s) failed: %m", str_c(path)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 ret = -1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 |
9584
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
283 if (ret == 0) { |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
284 acllist_path = acl_list_get_path(backend); |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
285 if (rename(str_c(path), acllist_path) < 0) { |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
286 i_error("rename(%s, %s) failed: %m", |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
287 str_c(path), acllist_path); |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
288 ret = -1; |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
289 } |
fd83d1f43ce5
acl+mbox: Create also temp acllist file to control directory.
Timo Sirainen <tss@iki.fi>
parents:
9582
diff
changeset
|
290 } |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 if (ret == 0) { |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8430
diff
changeset
|
292 struct acl_user *auser = ACL_USER_CONTEXT(ns->user); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8430
diff
changeset
|
293 |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 backend->acllist_mtime = st.st_mtime; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 backend->acllist_last_check = ioloop_time; |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8430
diff
changeset
|
296 /* FIXME: dict reubild is expensive, try to avoid it */ |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8430
diff
changeset
|
297 (void)acl_lookup_dict_rebuild(auser->acl_lookup_dict); |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 } else { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 acllist_clear(backend, 0); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 if (unlink(str_c(path)) < 0 && errno != ENOENT) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 i_error("unlink(%s) failed: %m", str_c(path)); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 } |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
303 backend->rebuilding_acllist = FALSE; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 return ret; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 |
9506
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
307 int acl_backend_vfile_acllist_rebuild(struct acl_backend_vfile *backend) |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
308 { |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
309 const char *acllist_path; |
9506
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
310 |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
311 if (acl_backend_vfile_acllist_try_rebuild(backend) == 0) |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
312 return 0; |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
313 else { |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
314 /* delete it to make sure it gets rebuilt later */ |
9582
ad43ac627724
acl+mbox: Create dovecot-acl-list to control dir.
Timo Sirainen <tss@iki.fi>
parents:
9537
diff
changeset
|
315 acllist_path = acl_list_get_path(backend); |
9506
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
316 if (unlink(acllist_path) < 0 && errno != ENOENT) |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
317 i_error("unlink(%s) failed: %m", acllist_path); |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
318 return -1; |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
319 } |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
320 } |
0cc9e2028580
acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
Timo Sirainen <tss@iki.fi>
parents:
9434
diff
changeset
|
321 |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 static const struct acl_backend_vfile_acllist * |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 acl_backend_vfile_acllist_find(struct acl_backend_vfile *backend, |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 const char *name) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 const struct acl_backend_vfile_acllist *acllist; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9601
diff
changeset
|
328 array_foreach(&backend->acllist, acllist) { |
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9601
diff
changeset
|
329 if (strcmp(acllist->name, name) == 0) |
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9601
diff
changeset
|
330 return acllist; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 return NULL; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 void acl_backend_vfile_acllist_verify(struct acl_backend_vfile *backend, |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 const char *name, time_t mtime) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 const struct acl_backend_vfile_acllist *acllist; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
340 if (backend->rebuilding_acllist || backend->iterating_acllist) |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
341 return; |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
342 |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 acl_backend_vfile_acllist_refresh(backend); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 acllist = acl_backend_vfile_acllist_find(backend, name); |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
345 if (acllist != NULL && acllist->mtime != mtime) |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 (void)acl_backend_vfile_acllist_rebuild(backend); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 struct acl_mailbox_list_context * |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 acl_backend_vfile_nonowner_iter_init(struct acl_backend *_backend) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 struct acl_backend_vfile *backend = |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 (struct acl_backend_vfile *)_backend; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 struct acl_mailbox_list_context_vfile *ctx; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 acl_backend_vfile_acllist_refresh(backend); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 ctx = i_new(struct acl_mailbox_list_context_vfile, 1); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 ctx->ctx.backend = _backend; |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
360 backend->iterating_acllist = TRUE; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 return &ctx->ctx; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx, |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 const char **name_r) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 { |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 struct acl_mailbox_list_context_vfile *ctx = |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 (struct acl_mailbox_list_context_vfile *)_ctx; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 struct acl_backend_vfile *backend = |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 (struct acl_backend_vfile *)_ctx->backend; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 const struct acl_backend_vfile_acllist *acllist; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 unsigned int count; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 acllist = array_get(&backend->acllist, &count); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 if (ctx->idx == count) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 return 0; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 *name_r = acllist[ctx->idx++].name; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 return 1; |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 } |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 void |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx) |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 { |
8896
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
385 struct acl_backend_vfile *backend = |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
386 (struct acl_backend_vfile *)ctx->backend; |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
387 |
db0072f7c6b4
acl: Fixed crash when rebuilding dovecot-acl-list file.
Timo Sirainen <tss@iki.fi>
parents:
8767
diff
changeset
|
388 backend->iterating_acllist = FALSE; |
5552
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 i_free(ctx); |
71b5fd371b9a
Create dovecot-acl-list file that lists all mailboxes where non-owner has
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 } |
12777
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
391 |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
392 int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *_backend) |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
393 { |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
394 struct acl_backend_vfile *backend = |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
395 (struct acl_backend_vfile *)_backend; |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
396 |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
397 return acl_backend_vfile_acllist_rebuild(backend); |
988e363ac17d
acl: Added acl_backend_nonowner_lookups_rebuild()
Timo Sirainen <tss@iki.fi>
parents:
12630
diff
changeset
|
398 } |