imap-acl-plugin.c revision 04870054863757edf048c81dcce3c5e7dec453cd
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#define ERROR_NOT_ADMIN "["IMAP_RESP_CODE_ACL"] " \
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen "You lack administrator privileges on this mailbox."
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen (MAILBOX_OPEN_READONLY | MAILBOX_OPEN_FAST | MAILBOX_OPEN_KEEP_RECENT)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic const struct imap_acl_letter_map imap_acl_letter_map[] = {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic struct mailbox *
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenacl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen /* Force opening the mailbox so that we can give a nicer error message
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if mailbox isn't selectable but is listable. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen box = mailbox_open(storage, name, NULL, ACL_MAILBOX_OPEN_FLAGS |
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_ADMIN);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* not an administrator. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_LOOKUP) <= 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client_send_tagline(cmd, "NO "ERROR_NOT_ADMIN);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstatic const struct imap_acl_letter_map *
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen unsigned int i;
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen for (i = 0; imap_acl_letter_map[i].name != NULL; i++) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen if (strcmp(imap_acl_letter_map[i].name, name) == 0)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenimap_acl_write_rights_list(string_t *dest, const char *const *rights)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen unsigned int i;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* write only letters */
e3e5ca6aec3efe6ef7419f411d934a5350f06df9Timo Sirainenimap_acl_write_right(string_t *dest, string_t *tmp,
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen const char *const *rights = neg ? right->neg_rights : right->rights;
2c50ccaa9adb7df8cb49a240909fce732da57bedTimo Sirainen str_append(tmp, IMAP_ACL_GROUP_OVERRIDE_PREFIX);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen imap_quote_append(dest, str_data(tmp), str_len(tmp), FALSE);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstatic int imap_acl_write_aclobj(string_t *dest, struct acl_object *aclobj)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen while ((ret = acl_object_list_next(iter, &rights)) > 0) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen imap_acl_write_right(dest, tmp, &rights, FALSE);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen imap_acl_write_right(dest, tmp, &rights, TRUE);
return ret;
const char *mailbox;
unsigned int len;
int ret;
return TRUE;
return TRUE;
if (ret == 0) {
return TRUE;
const char *const *rights;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
const char **error_r)
*letters);
id);
return TRUE;
identifier++;
return TRUE;
return TRUE;
return TRUE;
switch (*rights) {
rights++;
rights++;
if (negative) {
return TRUE;
return TRUE;
identifier++;
return TRUE;
return TRUE;
return TRUE;
void imap_acl_plugin_init(void)
const char *env;
void imap_acl_plugin_deinit(void)