mirror of
https://github.com/docker-mailserver/docker-mailserver.git
synced 2024-01-19 02:48:50 +00:00
e3cc627e18
* chore: Split vhost helper method and use filepath vars - Helpers `accounts.sh` and `aliases.sh` can move their vhost code into this helper. - They share duplicate code with `bin/open-dkim` which will also leverage this vhost helper going forward. * chore: Sync vhost generation logic into helper - Chunky commit, but mostly copy/paste of logic into a common method. - `bin/open-dkim` additionally wrapped relevant logic in a function call and revised inline docs. * chore: Include LDAP vhost support - Revises notes for LDAP vhost support. - This now ensures LDAP users get vhost rebuilt to match the startup script for when change detection support is enabled. - `bin/open-dkim` will additionally be able to support the default `DOMAINNAME` var (set via `helpers/dns.sh`) for LDAP users instead of requiring them to provide one explicitly. * chore(`bin/open-dkim`): Ensure `DOMAINNAME` is properly set - This will ensure LDAP users insert the same `DOMAINNAME` value as used during container startup. - The container itself should panic at startup (during `helpers/dns.sh`) if this isn't configured correctly already, thus it should not introduce any breaking change to users of this utility? * chore: Set the 2nd value as blank `_` Line is split by a delimiter such as white-space (or via IFS: `|`), the blank `_` var is to indicate we're not interested in that value, but still leverage how `read -r` works, instead of splitting the var ourselves first thing. * chore: Remove shellcheck disable lines No longer applicable with the switch to `_`
179 lines
5.4 KiB
Bash
Executable file
179 lines
5.4 KiB
Bash
Executable file
#! /bin/bash
|
|
|
|
# shellcheck source=../scripts/helpers/index.sh
|
|
source /usr/local/bin/helpers/index.sh
|
|
|
|
KEYSIZE=4096
|
|
SELECTOR=mail
|
|
DOMAINS=
|
|
|
|
function __usage
|
|
{
|
|
printf '%s' "${PURPLE}OPEN-DKIM${RED}(${YELLOW}8${RED})
|
|
|
|
${ORANGE}NAME${RESET}
|
|
open-dkim - configure DomainKeys Identified Mail (DKIM)
|
|
|
|
${ORANGE}SYNOPSIS${RESET}
|
|
./setup.sh config dkim [ OPTIONS${RED}...${RESET} ]
|
|
|
|
${ORANGE}DESCRIPTION${RESET}
|
|
Configures DKIM keys. OPTIONS can be used to configure a more complex setup.
|
|
LDAP setups require these options.
|
|
|
|
${ORANGE}OPTIONS${RESET}
|
|
${BLUE}Generic Program Information${RESET}
|
|
help Print the usage information.
|
|
|
|
${BLUE}Configuration adjustments${RESET}
|
|
keysize Set the size of the keys to be generated. Possible are 1024, 2024 and 4096 (default).
|
|
selector Set a manual selector (default is 'mail') for the key. (${LCYAN}ATTENTION${RESET}: NOT IMPLEMENTED YET!)
|
|
domain Provide the domain(s) for which keys are to be generated.
|
|
|
|
${ORANGE}EXAMPLES${RESET}
|
|
${LWHITE}./setup.sh config dkim keysize 2048${RESET}
|
|
Creates keys of length 2048 bit in a default setup where domains are obtained from
|
|
your accounts.
|
|
|
|
${LWHITE}./setup.sh config dkim keysize 2048 selector 2021-dkim${RESET}
|
|
Creates keys of length 2048 bit in a default setup where domains are obtained from
|
|
your accounts. The DKIM selector used is '2021-dkim'.
|
|
|
|
${LWHITE}./setup.sh config dkim keysize 2048 selector 2021-dkim domain 'whoami.com,whoareyou.org'${RESET}
|
|
Appropriate for an LDAP setup. Creates keys of length 2048 bit in a default setup
|
|
where domains are obtained from your accounts. The DKIM selector used is '2021-dkim'.
|
|
The domains for which DKIM keys are generated are 'whoami.com' and 'whoareyou.org'.
|
|
|
|
${ORANGE}EXIT STATUS${RESET}
|
|
Exit status is 0 if command was successful. If wrong arguments are provided or arguments contain
|
|
errors, the script will exit early with exit status 2.
|
|
|
|
"
|
|
}
|
|
|
|
[[ ${1:-} == 'help' ]] && { __usage ; exit 0 ; }
|
|
|
|
while [[ ${#} -gt 0 ]]
|
|
do
|
|
case "${1}" in
|
|
( 'keysize' )
|
|
if [[ -n ${2+set} ]]
|
|
then
|
|
KEYSIZE="${2}"
|
|
shift
|
|
shift
|
|
else
|
|
_exit_with_error "No keysize provided after 'keysize' argument"
|
|
fi
|
|
;;
|
|
|
|
( 'selector' )
|
|
if [[ -n ${2+set} ]]
|
|
then
|
|
# shellcheck disable=SC2034
|
|
SELECTOR="${2}"
|
|
shift
|
|
shift
|
|
else
|
|
_exit_with_error "No selector provided after 'selector' argument"
|
|
fi
|
|
;;
|
|
|
|
( 'domain' )
|
|
if [[ -n ${2+set} ]]
|
|
then
|
|
DOMAINS="${2}"
|
|
shift
|
|
shift
|
|
else
|
|
_exit_with_error "No domain(s) provided after 'domain' argument"
|
|
fi
|
|
;;
|
|
|
|
( * )
|
|
__usage
|
|
_exit_with_error "Unknown options '${1}' ${2:+and \'${2}\'}"
|
|
;;
|
|
|
|
esac
|
|
done
|
|
|
|
DATABASE_VHOST='/tmp/vhost.dkim'
|
|
# Prepare a file with one domain per line:
|
|
function _generate_domains_config
|
|
{
|
|
local TMP_VHOST='/tmp/vhost.dkim.tmp'
|
|
|
|
# Generate the default vhost (equivalent to /etc/postfix/vhost),
|
|
# unless CLI arg DOMAINS provided an alternative list to use instead:
|
|
if [[ -z ${DOMAINS} ]]
|
|
then
|
|
_obtain_hostname_and_domainname
|
|
# uses TMP_VHOST:
|
|
_vhost_collect_postfix_domains
|
|
else
|
|
tr ',' '\n' <<< "${DOMAINS}" >"${TMP_VHOST}"
|
|
fi
|
|
|
|
# uses DATABASE_VHOST + TMP_VHOST:
|
|
_create_vhost
|
|
}
|
|
|
|
_generate_domains_config
|
|
if [[ ! -s ${DATABASE_VHOST} ]]
|
|
then
|
|
_log 'warn' 'No entries found, no keys to make'
|
|
exit 0
|
|
fi
|
|
|
|
while read -r DKIM_DOMAIN
|
|
do
|
|
mkdir -p "/tmp/docker-mailserver/opendkim/keys/${DKIM_DOMAIN}"
|
|
|
|
if [[ ! -f "/tmp/docker-mailserver/opendkim/keys/${DKIM_DOMAIN}/${SELECTOR}.private" ]]
|
|
then
|
|
_log 'info' "Creating DKIM private key '/tmp/docker-mailserver/opendkim/keys/${DKIM_DOMAIN}/${SELECTOR}.private'"
|
|
|
|
opendkim-genkey \
|
|
--bits="${KEYSIZE}" \
|
|
--subdomains \
|
|
--domain="${DKIM_DOMAIN}" \
|
|
--selector="${SELECTOR}" \
|
|
--directory="/tmp/docker-mailserver/opendkim/keys/${DKIM_DOMAIN}"
|
|
fi
|
|
|
|
# write to KeyTable if necessary
|
|
KEYTABLEENTRY="${SELECTOR}._domainkey.${DKIM_DOMAIN} ${DKIM_DOMAIN}:${SELECTOR}:/etc/opendkim/keys/${DKIM_DOMAIN}/${SELECTOR}.private"
|
|
if [[ ! -f "/tmp/docker-mailserver/opendkim/KeyTable" ]]
|
|
then
|
|
_log 'debug' 'Creating DKIM KeyTable'
|
|
echo "${KEYTABLEENTRY}" >/tmp/docker-mailserver/opendkim/KeyTable
|
|
else
|
|
if ! grep -q "${KEYTABLEENTRY}" "/tmp/docker-mailserver/opendkim/KeyTable"
|
|
then
|
|
echo "${KEYTABLEENTRY}" >>/tmp/docker-mailserver/opendkim/KeyTable
|
|
fi
|
|
fi
|
|
|
|
# write to SigningTable if necessary
|
|
SIGNINGTABLEENTRY="*@${DKIM_DOMAIN} ${SELECTOR}._domainkey.${DKIM_DOMAIN}"
|
|
if [[ ! -f /tmp/docker-mailserver/opendkim/SigningTable ]]
|
|
then
|
|
_log 'debug' 'Creating DKIM SigningTable'
|
|
echo "*@${DKIM_DOMAIN} ${SELECTOR}._domainkey.${DKIM_DOMAIN}" >/tmp/docker-mailserver/opendkim/SigningTable
|
|
else
|
|
if ! grep -q "${SIGNINGTABLEENTRY}" /tmp/docker-mailserver/opendkim/SigningTable
|
|
then
|
|
echo "${SIGNINGTABLEENTRY}" >>/tmp/docker-mailserver/opendkim/SigningTable
|
|
fi
|
|
fi
|
|
done < <(_get_valid_lines_from_file "${DATABASE_VHOST}")
|
|
|
|
# create TrustedHosts if missing
|
|
if [[ -d /tmp/docker-mailserver/opendkim ]] && [[ ! -f /tmp/docker-mailserver/opendkim/TrustedHosts ]]
|
|
then
|
|
_log 'debug' 'Creating DKIM TrustedHosts'
|
|
echo "127.0.0.1" >/tmp/docker-mailserver/opendkim/TrustedHosts
|
|
echo "localhost" >>/tmp/docker-mailserver/opendkim/TrustedHosts
|
|
fi
|