From 907c05299c7799d009e37427db9a31855be4ed57 Mon Sep 17 00:00:00 2001 From: John Supplee Date: Mon, 28 Jan 2019 09:24:09 +0200 Subject: [PATCH] Add quota support --- README.md | 12 +++ .../conf.d/15-mailboxes.conf} | 0 conf/dovecot/conf.d/20-imap.conf | 94 +++++++++++++++++++ conf/dovecot/conf.d/90-quota.conf | 84 +++++++++++++++++ conf/dovecot/dovecot-sql.conf.ext | 6 ++ conf/roundcube/config.inc.php | 37 ++++++++ setup/mail-dovecot.sh | 6 +- 7 files changed, 238 insertions(+), 1 deletion(-) rename conf/{dovecot-mailboxes.conf => dovecot/conf.d/15-mailboxes.conf} (100%) create mode 100644 conf/dovecot/conf.d/20-imap.conf create mode 100644 conf/dovecot/conf.d/90-quota.conf create mode 100644 conf/dovecot/dovecot-sql.conf.ext create mode 100644 conf/roundcube/config.inc.php diff --git a/README.md b/README.md index 300fe496..38b3ce86 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ +Mail-in-a-Box with Quotas +========================= + +This is an experimental implementation of Main-in-a-box with quotas. Follow the directions below to install except +clone from this repository instead of the official repository. + +There is no support for quotas in control panel at the moment. To set quotas for a user you need to set the `quota` +column for the user in the `users.sqlite` database. The `quota` column is text and allows for the `M` and `G` suffixes +for megabytes and gigabytes respectively. No spaces should be used in the quota value (e.g. `2G` or `100M`). + +\[BEGIN Official README] + Mail-in-a-Box ============= diff --git a/conf/dovecot-mailboxes.conf b/conf/dovecot/conf.d/15-mailboxes.conf similarity index 100% rename from conf/dovecot-mailboxes.conf rename to conf/dovecot/conf.d/15-mailboxes.conf diff --git a/conf/dovecot/conf.d/20-imap.conf b/conf/dovecot/conf.d/20-imap.conf new file mode 100644 index 00000000..b9855b89 --- /dev/null +++ b/conf/dovecot/conf.d/20-imap.conf @@ -0,0 +1,94 @@ +## +## IMAP specific settings +## + +# If nothing happens for this long while client is IDLEing, move the connection +# to imap-hibernate process and close the old imap process. This saves memory, +# because connections use very little memory in imap-hibernate process. The +# downside is that recreating the imap process back uses some resources. +#imap_hibernate_timeout = 0 + +# Maximum IMAP command line length. Some clients generate very long command +# lines with huge mailboxes, so you may need to raise this if you get +# "Too long argument" or "IMAP command line too large" errors often. +#imap_max_line_length = 64k + +# IMAP logout format string: +# %i - total number of bytes read from client +# %o - total number of bytes sent to client +# %{fetch_hdr_count} - Number of mails with mail header data sent to client +# %{fetch_hdr_bytes} - Number of bytes with mail header data sent to client +# %{fetch_body_count} - Number of mails with mail body data sent to client +# %{fetch_body_bytes} - Number of bytes with mail body data sent to client +# %{deleted} - Number of mails where client added \Deleted flag +# %{expunged} - Number of mails that client expunged, which does not +# include automatically expunged mails +# %{autoexpunged} - Number of mails that were automatically expunged after +# client disconnected +# %{trashed} - Number of mails that client copied/moved to the +# special_use=\Trash mailbox. +# %{appended} - Number of mails saved during the session +#imap_logout_format = in=%i out=%o + +# Override the IMAP CAPABILITY response. If the value begins with '+', +# add the given capabilities on top of the defaults (e.g. +XFOO XBAR). +#imap_capability = + +# How long to wait between "OK Still here" notifications when client is +# IDLEing. +#imap_idle_notify_interval = 2 mins +imap_idle_notify_interval=4 mins + +# ID field names and values to send to clients. Using * as the value makes +# Dovecot use the default value. The following fields have default values +# currently: name, version, os, os-version, support-url, support-email. +#imap_id_send = + +# ID fields sent by client to log. * means everything. +#imap_id_log = + +# Workarounds for various client bugs: +# delay-newmail: +# Send EXISTS/RECENT new mail notifications only when replying to NOOP +# and CHECK commands. Some clients ignore them otherwise, for example OSX +# Mail ( + +## +## Quota limits +## + +# Quota limits are set using "quota_rule" parameters. To get per-user quota +# limits, you can set/override them by returning "quota_rule" extra field +# from userdb. It's also possible to give mailbox-specific limits, for example +# to give additional 100 MB when saving to Trash: + +plugin { + #quota_rule = *:storage=1G + #quota_rule2 = Trash:storage=+100M + + # LDA/LMTP allows saving the last mail to bring user from under quota to + # over quota, if the quota doesn't grow too high. Default is to allow as + # long as quota will stay under 10% above the limit. Also allowed e.g. 10M. + #quota_grace = 10%% + + # Quota plugin can also limit the maximum accepted mail size. + #quota_max_mail_size = 100M +} + +## +## Quota warnings +## + +# You can execute a given command when user exceeds a specified quota limit. +# Each quota root has separate limits. Only the command for the first +# exceeded limit is excecuted, so put the highest limit first. +# The commands are executed via script service by connecting to the named +# UNIX socket (quota-warning below). +# Note that % needs to be escaped as %%, otherwise "% " expands to empty. + +plugin { + #quota_warning = storage=95%% quota-warning 95 %u + #quota_warning2 = storage=80%% quota-warning 80 %u +} + +# Example quota-warning service. The unix listener's permissions should be +# set in a way that mail processes can connect to it. Below example assumes +# that mail processes run as vmail user. If you use mode=0666, all system users +# can generate quota warnings to anyone. +#service quota-warning { +# executable = script /usr/local/bin/quota-warning.sh +# user = dovecot +# unix_listener quota-warning { +# user = vmail +# } +#} + +## +## Quota backends +## + +# Multiple backends are supported: +# dirsize: Find and sum all the files found from mail directory. +# Extremely SLOW with Maildir. It'll eat your CPU and disk I/O. +# dict: Keep quota stored in dictionary (eg. SQL) +# maildir: Maildir++ quota +# fs: Read-only support for filesystem quota + +plugin { + quota = maildir + #quota = dirsize:User quota + #quota = maildir:User quota + #quota = dict:User quota::proxy::quota + #quota = fs:User quota +} + +# Multiple quota roots are also possible, for example this gives each user +# their own 100MB quota and one shared 1GB quota within the domain: +plugin { + #quota = dict:user::proxy::quota + #quota2 = dict:domain:%d:proxy::quota_domain + #quota_rule = *:storage=102400 + #quota2_rule = *:storage=1048576 +} diff --git a/conf/dovecot/dovecot-sql.conf.ext b/conf/dovecot/dovecot-sql.conf.ext new file mode 100644 index 00000000..497043c0 --- /dev/null +++ b/conf/dovecot/dovecot-sql.conf.ext @@ -0,0 +1,6 @@ +driver = sqlite +connect = /home/user-data/mail/users.sqlite +default_pass_scheme = SHA512-CRYPT +password_query = SELECT email as user, password FROM users WHERE email='%u'; +user_query = SELECT email AS user, "mail" as uid, "mail" as gid, "/home/user-data/mail/mailboxes/%d/%n" as home, '*:bytes=' || quota AS quota_rule FROM users WHERE email='%u'; +iterate_query = SELECT email AS user FROM users; diff --git a/conf/roundcube/config.inc.php b/conf/roundcube/config.inc.php new file mode 100644 index 00000000..86be2529 --- /dev/null +++ b/conf/roundcube/config.inc.php @@ -0,0 +1,37 @@ + array( + 'verify_peer' => false, + 'verify_peer_name' => false, + ), + ); +$config['imap_timeout'] = 15; +$config['smtp_server'] = 'tls://127.0.0.1'; +$config['smtp_port'] = 587; +$config['smtp_user'] = '%u'; +$config['smtp_pass'] = '%p'; +$config['smtp_conn_options'] = array( + 'ssl' => array( + 'verify_peer' => false, + 'verify_peer_name' => false, + ), + ); +$config['support_url'] = 'https://mailinabox.email/'; +$config['product_name'] = 'box.supplee.com Webmail'; +$config['des_key'] = 'eE4MCgtZQwgVZVBalTwPWMaC'; +$config['plugins'] = array('html5_notifier', 'archive', 'zipdownload', 'password', 'managesieve', 'jqueryui', 'persistent_login', 'carddav'); +$config['skin'] = 'larry'; +$config['login_autocomplete'] = 2; +$config['password_charset'] = 'UTF-8'; +$config['junk_mbox'] = 'Spam'; +$config['quota_zero_as_unlimited'] = true; +?> diff --git a/setup/mail-dovecot.sh b/setup/mail-dovecot.sh index 4bcc53aa..46f5ae6f 100755 --- a/setup/mail-dovecot.sh +++ b/setup/mail-dovecot.sh @@ -66,7 +66,11 @@ tools/editconf.py /etc/dovecot/conf.d/10-mail.conf \ first_valid_uid=0 # Create, subscribe, and mark as special folders: INBOX, Drafts, Sent, Trash, Spam and Archive. -cp conf/dovecot-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf +cp conf/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/ +cp conf/dovecot/conf.d/20-imap.conf /etc/dovecot/conf.d/ +cp conf/dovecot/conf.d/90-quota.conf /etc/dovecot/conf.d/ +cp conf/dovecot/dovecot-sql.conf.ext /etc/dovecot/ +cp conf/roundcube/config.inc.php /usr/local/lib/roundcubemail/config/ # ### IMAP/POP