imap-acl-plugin.c revision ac0fed903142d28ae3a1d5d00d2097fdf161b138
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen/* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#define ERROR_NOT_ADMIN "["IMAP_RESP_CODE_NOPERM"] " \
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen "You lack administrator privileges on this mailbox."
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen (MAILBOX_FLAG_READONLY | MAILBOX_FLAG_KEEP_RECENT)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic const struct imap_acl_letter_map imap_acl_letter_map[] = {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenconst char *imap_acl_plugin_version = DOVECOT_VERSION;
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenstatic void (*next_hook_client_created)(struct client **client);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic struct mailbox *
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenacl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (ACL_USER_CONTEXT(cmd->client->user) == NULL) {
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen client_send_command_error(cmd, "ACLs disabled.");
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen ns = client_find_namespace(cmd, name, &storage_name, &status);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen client_fail_mailbox_name_status(cmd, name, NULL, status);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* Force opening the mailbox so that we can give a nicer error message
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if mailbox isn't selectable but is listable. */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen box = mailbox_alloc(ns->list, storage_name, ACL_MAILBOX_FLAGS |
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen ret = acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_ADMIN);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* not an administrator. */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_LOOKUP) <= 0) {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen client_send_tagline(cmd, "NO "ERROR_NOT_ADMIN);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic const struct imap_acl_letter_map *
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen unsigned int i;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen for (i = 0; imap_acl_letter_map[i].name != NULL; i++) {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (strcmp(imap_acl_letter_map[i].name, name) == 0)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenimap_acl_write_rights_list(string_t *dest, const char *const *rights)
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen /* write only letters */
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainenimap_acl_write_right(string_t *dest, string_t *tmp,
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen const char *const *rights = neg ? right->neg_rights : right->rights;
case ACL_ID_GROUP:
case ACL_ID_GROUP_OVERRIDE:
case ACL_ID_TYPE_COUNT:
i_unreached();
case ACL_ID_OWNER:
return TRUE;
case ACL_ID_USER:
return FALSE;
return ret;
bool add_default)
const char *username;
int ret;
if (!convert_owner) {
return ret;
const char *mailbox;
int ret;
return FALSE;
return TRUE;
if (ret == 0) {
return TRUE;
const char *const *rights;
return FALSE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
return FALSE;
return TRUE;
return TRUE;
const char **error_r)
switch (*letters) {
const char *env;
id);
const char *const *default_rights;
case ACL_MODIFY_MODE_ADD:
case ACL_MODIFY_MODE_REMOVE:
case ACL_MODIFY_MODE_REPLACE:
struct acl_rights *r;
return FALSE;
return TRUE;
identifier++;
switch (*rights) {
rights++;
rights++;
return TRUE;
return TRUE;
return TRUE;
return TRUE;
if (negative) {
return TRUE;
return FALSE;
return TRUE;
identifier++;
return TRUE;
return TRUE;
return TRUE;
void imap_acl_plugin_deinit(void)