imap-acl-plugin.c revision c1faff067b29fb48426cb84260adba563e93189a
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen/* Copyright (c) 2008-2012 Dovecot authors, see the included COPYING file */
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen#define ERROR_NOT_ADMIN "["IMAP_RESP_CODE_NOPERM"] " \
42681892b206d13cb87a5f526d2bf4ff3f2f4af7Timo Sirainen "You lack administrator privileges on this mailbox."
42681892b206d13cb87a5f526d2bf4ff3f2f4af7Timo Sirainenstatic const struct imap_acl_letter_map imap_acl_letter_map[] = {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenconst char *imap_acl_plugin_version = DOVECOT_VERSION;
cf63dc8723b971cc80638fccbf494d961cbafc7fTimo Sirainenstatic imap_client_created_func_t *next_hook_client_created;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenstatic struct mailbox *
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainenacl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen enum mailbox_existence existence = MAILBOX_EXISTENCE_NONE;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen if (ACL_USER_CONTEXT(cmd->client->user) == NULL) {
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen client_send_command_error(cmd, "ACLs disabled.");
0a9cb42cbb135e3200cbfbb657820304cca8ecb8Timo Sirainen /* Force opening the mailbox so that we can give a nicer error message
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if mailbox isn't selectable but is listable. */
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen box = mailbox_alloc(ns->list, name, MAILBOX_FLAG_READONLY |
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainen if (mailbox_exists(box, TRUE, &existence) == 0 &&
cdfdb67422891a44fc7d9ace6bc1a00185fd3528Timo Sirainen ret = acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_ADMIN);
1d082a46e1676e7ec13928d588c4a25e062713ccTimo Sirainen /* mailbox doesn't exist / not an administrator. */
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainen acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_LOOKUP) <= 0) {
32c779d5d0b3dabc697408e6b5d9d2e652180b33Timo Sirainen client_send_tagline(cmd, "NO "ERROR_NOT_ADMIN);
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainenstatic const struct imap_acl_letter_map *
29f138b4b9bc037b21dfaa6b8e458943a99d5db2Timo Sirainen unsigned int i;
29f138b4b9bc037b21dfaa6b8e458943a99d5db2Timo Sirainen for (i = 0; imap_acl_letter_map[i].name != NULL; i++) {
7358272563d8ef77366447708ab0e58c0cff4151Timo Sirainen if (strcmp(imap_acl_letter_map[i].name, name) == 0)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenimap_acl_write_rights_list(string_t *dest, const char *const *rights)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen /* write only letters */
5685e60e62a8e0d368bd28a1526056f97bbba022Timo Sirainenimap_acl_write_right(string_t *dest, string_t *tmp,
72bc08129fb0aaec8144cc183a998ccc426fef9eTimo Sirainen const char *const *rights = neg ? right->neg_rights : right->rights;
23878bd03d1de531e3261a25598beec621351910Timo Sirainen str_append(tmp, IMAP_ACL_GROUP_OVERRIDE_PREFIX);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen imap_quote_append(dest, str_data(tmp), str_len(tmp), FALSE);
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainenacl_rights_is_owner(struct acl_backend *backend,
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistatic bool have_positive_owner_rights(struct acl_backend *backend,
977f08d645b1779527c0938bbb848b61064839c3Aki Tuomi while ((ret = acl_object_list_next(iter, &rights)) > 0) {
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainenimap_acl_write_aclobj(string_t *dest, struct acl_backend *backend,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen struct acl_object *aclobj, bool convert_owner,
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 *mailbox;
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)