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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
069679de3005 acl: Fixed previous mbox fix.
Timo Sirainen <tss@iki.fi>
parents: 9584
diff changeset
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
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
83 /* we're never going to build acllist for this namespace. */
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
84 i_array_init(&backend->acllist, 1);
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
85 return 0;
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
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
272796cfee66 compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
146 if (backend->acllist_last_check +
272796cfee66 compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
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
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
215 if (rootdir == NULL)
909ed7cd98a5 ACL: Handle shared namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7428
diff changeset
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 }