43
return acl_cache_mask_isset(have_mask, right_idx);
47
if (acl_cache_mask_isset(have_mask, right_idx))
50
if (mailbox_list_get_user(aclobj->backend->list)->dsyncing) {
51
/* when dsync is running on a shared mailbox, it must be able
52
to do everything inside it. however, dsync shouldn't touch
53
mailboxes where user doesn't have any read access, because
54
that could make them readable on the replica. */
55
read_idx = acl_backend_lookup_right(aclobj->backend,
57
if (acl_cache_mask_isset(have_mask, read_idx))
46
63
const char *const *
222
const char *acl_rights_get_id(const struct acl_rights *right)
224
string_t *str = t_str_new(32);
226
acl_rights_write_id(str, right);
230
static bool is_standard_right(const char *name)
234
for (i = 0; all_mailbox_rights[i] != NULL; i++) {
235
if (strcmp(all_mailbox_rights[i], name) == 0)
241
int acl_rights_update_import(struct acl_rights_update *update,
242
const char *id, const char *const *rights,
243
const char **error_r)
245
ARRAY_TYPE(const_string) dest_rights, dest_neg_rights, *dest;
248
if (acl_identifier_parse(id, &update->rights) < 0) {
249
*error_r = t_strdup_printf("Invalid ID: %s", id);
252
if (rights == NULL) {
253
update->modify_mode = ACL_MODIFY_MODE_CLEAR;
254
update->neg_modify_mode = ACL_MODIFY_MODE_CLEAR;
258
t_array_init(&dest_rights, 8);
259
t_array_init(&dest_neg_rights, 8);
260
for (i = 0; rights[i] != NULL; i++) {
261
const char *right = rights[i];
267
dest = &dest_neg_rights;
269
if (strcmp(right, "all") != 0) {
271
/* non-standard right */
273
array_append(dest, &right, 1);
274
} else if (is_standard_right(right)) {
275
array_append(dest, &right, 1);
277
*error_r = t_strdup_printf("Invalid right '%s'",
282
for (j = 0; all_mailbox_rights[j] != NULL; j++)
283
array_append(dest, &all_mailbox_rights[j], 1);
286
if (array_count(&dest_rights) > 0) {
287
array_append_zero(&dest_rights);
288
update->rights.rights = array_idx(&dest_rights, 0);
289
} else if (update->modify_mode == ACL_MODIFY_MODE_REPLACE) {
290
update->modify_mode = ACL_MODIFY_MODE_CLEAR;
292
if (array_count(&dest_neg_rights) > 0) {
293
array_append_zero(&dest_neg_rights);
294
update->rights.neg_rights = array_idx(&dest_neg_rights, 0);
295
} else if (update->neg_modify_mode == ACL_MODIFY_MODE_REPLACE) {
296
update->neg_modify_mode = ACL_MODIFY_MODE_CLEAR;
301
const char *acl_rights_export(const struct acl_rights *rights)
303
string_t *str = t_str_new(128);
305
if (rights->rights != NULL)
306
str_append(str, t_strarray_join(rights->rights, " "));
307
if (rights->neg_rights != NULL) {
308
if (str_len(str) > 0)
309
str_append_c(str, ' ');
310
str_append_c(str, '-');
311
str_append(str, t_strarray_join(rights->neg_rights, " -"));
200
316
bool acl_rights_has_nonowner_lookup_changes(const struct acl_rights *rights)
202
318
const char *const *p;