Dovecot: make home dir distinct from mail dir (#3335)

* add new home dir for Dovecot

I tried changing the mail dir, but this is a _very_ disruptive change,
so I took approach 3 on
<https://doc.dovecot.org/configuration_manual/home_directories_for_virtual_users/>,
whereby the home directory is now inside the mail directory.

The MDBOX/SDBOX formats are not touched by this change. The change
itself could be considered breaking though.

* adjust Sieve tests accordingly

* Update target/dovecot/10-mail.conf

* Update target/dovecot/auth-passwdfile.inc

---------

Co-authored-by: Casper <casperklein@users.noreply.github.com>
This commit is contained in:
Georg Lauterbach 2023-05-15 20:10:29 +02:00 committed by GitHub
parent a72adc2731
commit 7453bc096b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 10 additions and 11 deletions

View File

@ -27,6 +27,7 @@
# #
# <doc/wiki/MailLocation.txt> # <doc/wiki/MailLocation.txt>
# #
mail_home = /var/mail/%d/%n/home/
mail_location = maildir:/var/mail/%d/%n mail_location = maildir:/var/mail/%d/%n
# If you need to set multiple mailbox locations or want to change default # If you need to set multiple mailbox locations or want to change default

View File

@ -6,4 +6,3 @@ passdb {
result_success = continue result_success = continue
#auth_bind = yes #auth_bind = yes
} }

View File

@ -15,5 +15,5 @@ passdb {
userdb { userdb {
driver = passwd-file driver = passwd-file
args = username_format=%u /etc/dovecot/userdb args = username_format=%u /etc/dovecot/userdb
default_fields = uid=docker gid=docker home=/var/mail/%d/%u default_fields = uid=docker gid=docker home=/var/mail/%d/%u/home/
} }

View File

@ -77,7 +77,7 @@ function _create_accounts
# Dovecot's userdb has the following format # Dovecot's userdb has the following format
# user:password:uid:gid:(gecos):home:(shell):extra_fields # user:password:uid:gid:(gecos):home:(shell):extra_fields
DOVECOT_USERDB_LINE="${LOGIN}:${PASS}:5000:5000::/var/mail/${DOMAIN}/${USER}::${USER_ATTRIBUTES}" DOVECOT_USERDB_LINE="${LOGIN}:${PASS}:5000:5000::/var/mail/${DOMAIN}/${USER}/home::${USER_ATTRIBUTES}"
if grep -qF "${DOVECOT_USERDB_LINE}" "${DOVECOT_USERDB_FILE}" if grep -qF "${DOVECOT_USERDB_LINE}" "${DOVECOT_USERDB_FILE}"
then then
_log 'warn' "Login '${LOGIN}' will not be added to '${DOVECOT_USERDB_FILE}' twice" _log 'warn' "Login '${LOGIN}' will not be added to '${DOVECOT_USERDB_FILE}' twice"
@ -85,12 +85,12 @@ function _create_accounts
echo "${DOVECOT_USERDB_LINE}" >>"${DOVECOT_USERDB_FILE}" echo "${DOVECOT_USERDB_LINE}" >>"${DOVECOT_USERDB_FILE}"
fi fi
mkdir -p "/var/mail/${DOMAIN}/${USER}" mkdir -p "/var/mail/${DOMAIN}/${USER}/home"
# copy user provided sieve file, if present # copy user provided sieve file, if present
if [[ -e "/tmp/docker-mailserver/${LOGIN}.dovecot.sieve" ]] if [[ -e "/tmp/docker-mailserver/${LOGIN}.dovecot.sieve" ]]
then then
cp "/tmp/docker-mailserver/${LOGIN}.dovecot.sieve" "/var/mail/${DOMAIN}/${USER}/.dovecot.sieve" cp "/tmp/docker-mailserver/${LOGIN}.dovecot.sieve" "/var/mail/${DOMAIN}/${USER}/home/.dovecot.sieve"
fi fi
done < <(_get_valid_lines_from_file "${DATABASE_ACCOUNTS}") done < <(_get_valid_lines_from_file "${DATABASE_ACCOUNTS}")

View File

@ -24,10 +24,10 @@ function _setup_dovecot
( 'sdbox' | 'mdbox' ) ( 'sdbox' | 'mdbox' )
_log 'trace' "Dovecot ${DOVECOT_MAILBOX_FORMAT} format configured" _log 'trace' "Dovecot ${DOVECOT_MAILBOX_FORMAT} format configured"
sed -i -e \ sedfile -i -E "s|^(mail_home =).*|\1 /var/mail/%d/%n|" /etc/dovecot/conf.d/10-mail.conf
"s|^mail_location = .*$|mail_location = ${DOVECOT_MAILBOX_FORMAT}:\/var\/mail\/%d\/%n|g" \ sedfile -i -E \
"s|^(mail_location =).*|\1 ${DOVECOT_MAILBOX_FORMAT}:/var/mail/%d/%n|" \
/etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf
_log 'trace' 'Enabling cron job for dbox purge' _log 'trace' 'Enabling cron job for dbox purge'
mv /etc/cron.d/dovecot-purge.disabled /etc/cron.d/dovecot-purge mv /etc/cron.d/dovecot-purge.disabled /etc/cron.d/dovecot-purge
chmod 644 /etc/cron.d/dovecot-purge chmod 644 /etc/cron.d/dovecot-purge
@ -35,7 +35,6 @@ function _setup_dovecot
( * ) ( * )
_log 'trace' 'Dovecot default format (maildir) configured' _log 'trace' 'Dovecot default format (maildir) configured'
sed -i -e 's|^mail_location = .*$|mail_location = maildir:\/var\/mail\/%d\/%n|g' /etc/dovecot/conf.d/10-mail.conf
;; ;;
esac esac

View File

@ -17,9 +17,9 @@ function setup_file() {
--env ENABLE_MANAGESIEVE=1 --env ENABLE_MANAGESIEVE=1
# Required for mail delivery via nc: # Required for mail delivery via nc:
--env PERMIT_DOCKER=container --env PERMIT_DOCKER=container
# Mount into mail dir for user1 to treat as a user-sieve: # Mount into home dir for user1 to treat as a user-sieve:
# NOTE: Cannot use ':ro', 'start-mailserver.sh' attempts to 'chown -R' /var/mail: # NOTE: Cannot use ':ro', 'start-mailserver.sh' attempts to 'chown -R' /var/mail:
--volume "${TEST_TMP_CONFIG}/dovecot.sieve:/var/mail/localhost.localdomain/user1/.dovecot.sieve" --volume "${TEST_TMP_CONFIG}/dovecot.sieve:/var/mail/localhost.localdomain/user1/home/.dovecot.sieve"
) )
_common_container_setup 'CONTAINER_ARGS_ENV_CUSTOM' _common_container_setup 'CONTAINER_ARGS_ENV_CUSTOM'