enum imap_acl_cmd {
IMAP_ACL_CMD_MYRIGHTS = 0,
IMAP_ACL_CMD_GETACL,
+ IMAP_ACL_CMD_SETACL,
};
const char *imapc_acl_cmd_names[] = {
/* Strip namespace prefix. */
imap_append_astring(proxy_cmd_str, mailbox+prefix_len);
break;
+ case IMAP_ACL_CMD_SETACL:
+ /* No contents in untagged replies for SETACL */
+ str_append(proxy_cmd_str, "SETACL ");
+ /* Strip namespace prefix. */
+ imap_append_astring(proxy_cmd_str, mailbox+prefix_len);
+ str_append_c(proxy_cmd_str, ' ');
+ str_append(proxy_cmd_str, cmd_args);
+ break;
default:
i_unreached();
}
orig_cmd,
"OK Myrights complete.");
break;
+ case IMAP_ACL_CMD_SETACL:
+ client_send_tagline(orig_cmd, "OK Setacl complete.");
+ break;
default:
i_unreached();
}
struct mail_namespace *ns;
struct mailbox *box;
const char *mailbox, *orig_mailbox, *identifier, *rights;
+ string_t *proxy_cmd_args = t_str_new(64);
if (!client_read_string_args(cmd, 3, &mailbox, &identifier, &rights))
return FALSE;
return TRUE;
}
+ /* Keep original identifer for proxy_cmd_args */
+ imap_append_astring(proxy_cmd_args, identifier);
+ str_append_c(proxy_cmd_args, ' ');
+ /* Append original rights for proxy_cmd_args */
+ imap_append_astring(proxy_cmd_args, rights);
+
ns = client_find_namespace(cmd, &mailbox);
if (ns == NULL)
return TRUE;
box = mailbox_alloc(ns->list, mailbox,
MAILBOX_FLAG_READONLY | MAILBOX_FLAG_IGNORE_ACLS);
- imap_acl_cmd_setacl(box, ns, orig_mailbox, identifier, rights, cmd);
+ /* If the location is remote and imapc_feature acl is enabled, proxy the
+ command to the configured imapc location. */
+ if (!imap_acl_proxy_cmd(box, orig_mailbox, str_c(proxy_cmd_args),
+ ns->prefix_len, cmd, IMAP_ACL_CMD_SETACL))
+ imap_acl_cmd_setacl(box, ns, orig_mailbox, identifier, rights, cmd);
mailbox_free(&box);
return TRUE;
}