imap-acl-plugin.c revision e5b723864630e40c9028808ef417dd3d6fbf495b
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */
c6335901c67a4c9365319190a111a2168f3b06f5Timo Sirainen#define ERROR_NOT_ADMIN "["IMAP_RESP_CODE_NOPERM"] " \
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen "You lack administrator privileges on this mailbox."
047c00cd3f7f403672f81569413669238df8c15aTimo Sirainen (MAILBOX_OPEN_READONLY | MAILBOX_OPEN_FAST | MAILBOX_OPEN_KEEP_RECENT)
8b5c520883aa37bb55646286d375fdbae294d710Timo Sirainenstatic const struct imap_acl_letter_map imap_acl_letter_map[] = {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenconst char *imap_acl_plugin_version = PACKAGE_VERSION;
009217abb57a24a4076092e8e4e165545747839eStephan Boschstatic struct mailbox *
72f21884c0bb9bb26edad63623427ac2120901eaStephan Boschacl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen /* Force opening the mailbox so that we can give a nicer error message
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen if mailbox isn't selectable but is listable. */
541f258d86b2db26efd5670883966183b4fb6323Timo Sirainen box = mailbox_open(&storage, name, NULL, ACL_MAILBOX_OPEN_FLAGS |
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_ADMIN);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* not an administrator. */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_LOOKUP) <= 0) {
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen client_send_tagline(cmd, "NO "ERROR_NOT_ADMIN);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const struct imap_acl_letter_map *
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen unsigned int i;
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen for (i = 0; imap_acl_letter_map[i].name != NULL; i++) {
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen if (strcmp(imap_acl_letter_map[i].name, name) == 0)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenimap_acl_write_rights_list(string_t *dest, const char *const *rights)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int i;
3f603ef00e35fca21605afa0ad8d76e94fee2b96Timo Sirainen /* write only letters */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimap_acl_write_right(string_t *dest, string_t *tmp,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *const *rights = neg ? right->neg_rights : right->rights;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen str_append(tmp, IMAP_ACL_GROUP_OVERRIDE_PREFIX);
b2d562f9c7fd13f9a16e9b3bcee904630b80b1feTimo Sirainen imap_quote_append(dest, str_data(tmp), str_len(tmp), FALSE);
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic int imap_acl_write_aclobj(string_t *dest, struct acl_object *aclobj)
03baa1c4c51f7b08fb285e82b528fcb00ac09ebfTimo Sirainen while ((ret = acl_object_list_next(iter, &rights)) > 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen imap_acl_write_right(dest, tmp, &rights, FALSE);
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen imap_acl_write_right(dest, tmp, &rights, TRUE);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic bool cmd_getacl(struct client_command_context *cmd)
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen unsigned int len;
6303f32ad4af9cb08794561e6324df1c6c5fb637Timo Sirainen if (!client_read_string_args(cmd, 1, &mailbox)) {
6303f32ad4af9cb08794561e6324df1c6c5fb637Timo Sirainen client_send_command_error(cmd, "Invalid arguments.");
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen box = acl_mailbox_open_as_admin(cmd, mailbox);
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)
switch (*letters) {
id);
return TRUE;
identifier++;
switch (*rights) {
rights++;
rights++;
return TRUE;
return TRUE;
return TRUE;
if (negative) {
} else 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)