DOVEADM-ACL(1)

✨ DOVEADM-ACL(1) ✨

okay bestie, sit down, hydrate, because today we're learning doveadm-acl from the Dovecot manual β€” it's the page about managing Access Control Lists (ACLs, iykyk) πŸ’–


🌸 NAME 🌸

doveadm-acl β€” Manage Access Control List (ACL). that's it, that's the whole assignment πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

doveadm [GLOBAL OPTIONS] acl command [OPTIONS] [ARGUMENTS]

πŸŽ€ DESCRIPTION πŸŽ€

The doveadm acl COMMANDS are your little toolbox for doing basically every Access Control List related action you could ever want. it's giving "I control who sees what and I'm thriving" πŸ‘‘


πŸ’… GLOBAL OPTIONS πŸ’…

these are the global doveadm(1) options, the ones that apply before we even get to the acl-specific stuff:

  • -D β€” turns on verbosity and debug messages. chaos mode, but make it informative πŸ›
  • -O β€” do not read any config file, just use defaults. the dovecot_storage_version setting defaults to the latest version, but you can override it with -o. no cap.
  • -k β€” preserve the entire environment for doveadm, not just the import_environment setting. full vibe preservation 🫢
  • -v β€” enables verbosity, including a progress counter. so you can watch it work, main character behavior ✨
  • -i instance-name β€” if you're running multiple Dovecot instances, pick the config file based on this instance name. see the instance_name setting for more info.
  • -c config-file β€” read configuration from the given config-file. by default it first reads config socket, and then falls back to /etc/dovecot/dovecot.conf. you can also point this at the config socket of some instance running a compatible version πŸ‘€
  • -o setting=value β€” overrides the configuration setting from /etc/dovecot/dovecot.conf and from the userdb with the given value. wanna override multiple settings? the -o option may be specified multiple times, babe. stack 'em πŸ“š
  • -f formatter β€” specifies the formatter for formatting the output. supported formatters are:
    • flow β€” prints each line with key=value pairs.
    • json β€” prints a JSON array of JSON objects.
    • pager β€” prints each key: value pair on its own line and separates records with form feed character (^L).
    • tab β€” prints a table header followed by tab separated value lines.
    • table β€” prints a table header followed by adjusted value lines.

This command uses by default the output formatter table. periodt. πŸ’…


πŸ‘‘ OPTIONS πŸ‘‘

  • -A β€” if the -A option is present, the command will be performed for all users. using this with system users from userdb { driver = passwd } is not recommended, because it also contains users with a lower UID than the one configured with the first_valid_uid setting. > ⚠️ bestie, read that again. not recommended. I'm serious.
    • When the SQL userdb module is used, make sure that the userdb_sql_iterate_query setting matches your database layout.
    • When using the LDAP userdb module, make sure that the userdb_fields setting and the userdb_ldap_iterate_fields setting match your LDAP schema. otherwise doveadm(1) will be unable to iterate over all users 😭
  • -F file β€” execute the command for all the users in the file. this is similar to the -A option, but instead of getting the list of users from the userdb, they're read from the given file. the file contains one username per line. cute, simple, slay πŸ“„
  • --no-userdb-lookup β€” do not perform userdb lookup. use the USER environment variable to specify the username.
  • -S socket_path β€” the option's argument is either an absolute path to a local UNIX domain socket, or a hostname and port (hostname:port), in order to connect a remote host via a TCP socket.
    • this allows an administrator to execute doveadm(1) mail commands through the given socket πŸ”Œ
  • -u user/mask β€” run the command only for the given user. it's also possible to use '*' and '?' wildcards (e.g. -u *@example.org). wildcard era πŸ¦‹

πŸ“ ARGUMENTS πŸ“

🌈 id

the id (identifier) is one of:

  • group-override = group_name
  • user = user_name
  • owner
  • group = group_name
  • authenticated
  • anyone
  • anonymous, which is an alias for anyone

The ACLs are processed in the precedence given above, so for example if you have given read-access to a group, you can still remove that from specific users inside the group. order matters, bestie, it's not decorative 🌟

Group-override identifier allows you to override users' ACLs. Probably the most useful reason to do this is to temporarily disable access for some users. For example:

user=timo rw
group-override=tempdisabled

Now if timo is a member of the tempdisabled group, he has no access to the mailbox. This wouldn't be possible with a normal group identifier, because the user=timo would override it. iconic loophole, honestly πŸ‘‘

🧚 mailbox

the name of the mailbox for which the ACL manipulation should be done. it's also possible to use the wildcard characters "*" and/or "?" in the mailbox name.

Dovecot ACL right name. This isn't the same as the IMAP ACL letters, which aren't currently supported.

here's the mapping of the IMAP ACL letters to Dovecot ACL names:

  • l -> lookup : Mailbox is visible in mailbox list. Mailbox can be subscribed to.
  • r -> read : Mailbox can be opened for reading.
  • w -> write : Message flags and keywords can be changed, except \Seen and \Deleted.
  • s -> write-seen : \Seen flag can be changed.
  • t -> write-deleted : \Deleted flag can be changed.
  • i -> insert : Messages can be written or copied to the mailbox.
  • p -> post : Messages can be posted to the mailbox by dovecot-lda, e.g. from Sieve scripts.
  • e -> expunge : Messages can be expunged.
  • k -> create : Mailboxes can be created/renamed directly under this mailbox (but not necessarily under its children, see acl_inheritance. Note: Renaming also requires the delete right.
  • x -> delete : Mailbox can be deleted.
  • a -> admin : Administration rights to the mailbox (currently: ability to change ACLs for mailbox).

πŸ”₯ COMMANDS πŸ”₯

⭐ acl add

doveadm [GLOBAL OPTIONS] acl add [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox id right [right ...]

Add ACL rights to the mailbox/id. If the id already exists, the existing rights are preserved. we're adding, not replacing, okay? respect the originals 🫢

⭐ acl debug

doveadm [GLOBAL OPTIONS] acl debug [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox

This command can be used to debug why a shared mailbox isn't accessible to the user. It will list exactly what the problem is. your little detective πŸ•΅οΈβ€β™€οΈβœ¨

⭐ acl delete

doveadm [GLOBAL OPTIONS] acl delete [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox id

Remove the whole ACL entry for the mailbox/id. gone. deleted. not me being dramatic πŸ’€

⭐ acl get

doveadm [GLOBAL OPTIONS] acl get [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] [-m] mailbox

Show all the ACLs for the mailbox.

  • -m β€” only show ACLs that match the mailbox.

⭐ acl recalc

doveadm [GLOBAL OPTIONS] acl recalc [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path]

Make sure the user's shared mailboxes exist correctly in the acl_sharing_map. a lil maintenance moment 🧹🌸

⭐ acl remove

doveadm [GLOBAL OPTIONS] acl remove [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox id right [right ...]

Remove the specified ACL rights from the mailbox/id. If all rights are removed, the entry still exists without any rights. so the entry is still there, just empty β€” like a group chat nobody talks in anymore 😭

⭐ acl rights

doveadm [GLOBAL OPTIONS] acl rights [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox

Show the user's current ACL rights for the mailbox. the vibe check, but for permissions ✨

⭐ acl set

doveadm [GLOBAL OPTIONS] acl set [-u user | -A | -F file | --no-userdb-lookup] [-S socket_path] mailbox id right [right ...]

Set ACL rights to the mailbox/id. If the id already exists, the existing rights are replaced. full glow-up, out with the old πŸ’…


😭 REPORTING BUGS 😭

Report bugs, including doveconf -n output, to the Dovecot Mailing List ⟨dovecot@dovecot.org⟩. Information about reporting bugs is available at: ⟨https://dovecot.org/bugreport.html⟩

🫢 bestie, include that doveconf -n output. it's not optional and it's not a vibe, it's how they fix your thing.

πŸ¦„ SEE ALSO πŸ¦„

doveadm(1)

Additional resources:

  • acl_inheritance

and that's the whole page, bestie ✨ this was DOVEADM-ACL(1), source f979264, dated April 2026 β€” go forth and manage those ACLs, you absolute icon πŸ‘‘πŸ’–πŸ¦‹

πŸ“¦ where this page comes from