setup.sh: docker_container first, then fall back to docker_image (#2134)

* docker_container first, then fall back to docker_image
+ test changes to support
+ test change to wait for smtp port to fix flakey tests since https://github.com/docker-mailserver/docker-mailserver/pull/2104

* quick fix

* Update setup.sh

Co-authored-by: Georg Lauterbach <44545919+georglauterbach@users.noreply.github.com>
Co-authored-by: Casper <casperklein@users.noreply.github.com>
This commit is contained in:
Nathan Pierce 2021-09-06 06:13:12 -04:00 committed by GitHub
parent 317f3e41c2
commit 0da66ccb34
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 234 additions and 101 deletions

View file

@ -61,7 +61,6 @@ CONTAINER_NAME=
DEFAULT_CONFIG_PATH="${DIR}/config" DEFAULT_CONFIG_PATH="${DIR}/config"
IMAGE_NAME= IMAGE_NAME=
INFO= INFO=
USE_CONTAINER=false
USE_TTY= USE_TTY=
USE_SELINUX= USE_SELINUX=
VOLUME= VOLUME=
@ -126,9 +125,11 @@ ${ORANGE}DESCRIPTION${RESET}
This is the main administration script that you use for all interactions with your This is the main administration script that you use for all interactions with your
mail server. Setup, configuration and much more is done with this script. mail server. Setup, configuration and much more is done with this script.
Please note that the script executes most of the commands inside the container itself. Please note that this script executes most of its commands inside the running 'mailserver' container itself.
If the image was not found, this script will pull the ${WHITE}:latest${RESET} tag of If it cannot find a running container, it will attempt to run one using any available tags
${WHITE}mailserver/docker-mailserver${RESET}. This tag refers to the latest release, which include label=org.opencontainers.image.title=\"docker-mailserver\" and then run the necessary commands.
If the tag for the container is not found, this script will pull the ${WHITE}:latest${RESET} tag of
${WHITE}docker.io/mailserver/docker-mailserver${RESET}. This tag refers to the latest release,
see the tagging convention in the README under see the tagging convention in the README under
${BLUE}https://github.com/docker-mailserver/docker-mailserver/blob/master/README.md${RESET} ${BLUE}https://github.com/docker-mailserver/docker-mailserver/blob/master/README.md${RESET}
@ -155,7 +156,7 @@ ${ORANGE}OPTIONS${RESET}
Provides the name of the running container. Provides the name of the running container.
-p PATH -p PATH
Provides the config folder path. The default is Provides the config folder path to the temporary container (does not work if docker-mailserver container already exists). The default is
${WHITE}${DIR}/config/${RESET} ${WHITE}${DIR}/config/${RESET}
${LBLUE}SELinux${RESET} ${LBLUE}SELinux${RESET}
@ -228,22 +229,16 @@ function _docker_image_exists
function _docker_image function _docker_image
{ {
if ${USE_CONTAINER} # start temporary container with specified image
if ! _docker_image_exists "${IMAGE_NAME}"
then then
# reuse existing container specified on command line echo "Image '${IMAGE_NAME}' not found. Pulling ..."
${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}" ${CRI} pull "${IMAGE_NAME}"
else
# start temporary container with specified image
if ! _docker_image_exists "${IMAGE_NAME}"
then
echo "Image '${IMAGE_NAME}' not found. Pulling ..."
${CRI} pull "${IMAGE_NAME}"
fi
${CRI} run --rm \
-v "${CONFIG_PATH}:/tmp/docker-mailserver${USE_SELINUX}" \
"${USE_TTY}" "${IMAGE_NAME}" "${@:+$@}"
fi fi
${CRI} run --rm \
-v "${CONFIG_PATH}:/tmp/docker-mailserver${USE_SELINUX}" \
"${USE_TTY}" "${IMAGE_NAME}" "${@:+$@}"
} }
function _docker_container function _docker_container
@ -252,8 +247,8 @@ function _docker_container
then then
${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}" ${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}"
else else
echo "The mailserver is not running!" # If no container yet, run a temporary one: https://github.com/docker-mailserver/docker-mailserver/pull/1874#issuecomment-809781531
exit 1 _docker_image "${@:+$@}"
fi fi
} }
@ -302,7 +297,6 @@ function _main
c ) c )
# container specified, connect to running instance # container specified, connect to running instance
CONTAINER_NAME="${OPTARG}" CONTAINER_NAME="${OPTARG}"
USE_CONTAINER=true
;; ;;
p ) p )
@ -346,8 +340,8 @@ function _main
email ) email )
case ${2:-} in case ${2:-} in
add ) shift 2 ; _docker_image addmailuser "${@:+$@}" ;; add ) shift 2 ; _docker_container addmailuser "${@:+$@}" ;;
update ) shift 2 ; _docker_image updatemailuser "${@:+$@}" ;; update ) shift 2 ; _docker_container updatemailuser "${@:+$@}" ;;
del ) shift 2 ; _docker_container delmailuser "${@:+$@}" ;; del ) shift 2 ; _docker_container delmailuser "${@:+$@}" ;;
restrict ) shift 2 ; _docker_container restrict-access "${@:+$@}" ;; restrict ) shift 2 ; _docker_container restrict-access "${@:+$@}" ;;
list ) _docker_container listmailuser ;; list ) _docker_container listmailuser ;;
@ -357,40 +351,40 @@ function _main
alias ) alias )
case ${2:-} in case ${2:-} in
add ) shift 2 ; _docker_image addalias "${1}" "${2}" ;; add ) shift 2 ; _docker_container addalias "${1}" "${2}" ;;
del ) shift 2 ; _docker_image delalias "${1}" "${2}" ;; del ) shift 2 ; _docker_container delalias "${1}" "${2}" ;;
list ) shift 2 ; _docker_image listalias ;; list ) shift 2 ; _docker_container listalias ;;
* ) _usage ;; * ) _usage ;;
esac esac
;; ;;
quota ) quota )
case ${2:-} in case ${2:-} in
set ) shift 2 ; _docker_image setquota "${@:+$@}" ;; set ) shift 2 ; _docker_container setquota "${@:+$@}" ;;
del ) shift 2 ; _docker_image delquota "${@:+$@}" ;; del ) shift 2 ; _docker_container delquota "${@:+$@}" ;;
* ) _usage ;; * ) _usage ;;
esac esac
;; ;;
config ) config )
case ${2:-} in case ${2:-} in
dkim ) shift 2 ; _docker_image open-dkim "${@:+$@}" ;; dkim ) shift 2 ; _docker_container open-dkim "${@:+$@}" ;;
* ) _usage ;; * ) _usage ;;
esac esac
;; ;;
relay ) relay )
case ${2:-} in case ${2:-} in
add-domain ) shift 2 ; _docker_image addrelayhost "${@:+$@}" ;; add-domain ) shift 2 ; _docker_container addrelayhost "${@:+$@}" ;;
add-auth ) shift 2 ; _docker_image addsaslpassword "${@:+$@}" ;; add-auth ) shift 2 ; _docker_container addsaslpassword "${@:+$@}" ;;
exclude-domain ) shift 2 ; _docker_image excluderelaydomain "${@:+$@}" ;; exclude-domain ) shift 2 ; _docker_container excluderelaydomain "${@:+$@}" ;;
* ) _usage ;; * ) _usage ;;
esac esac
;; ;;
debug ) debug )
case ${2:-} in case ${2:-} in
fetchmail ) _docker_image debug-fetchmail ;; fetchmail ) _docker_container debug-fetchmail ;;
fail2ban ) shift 2 ; _docker_container fail2ban "${@:+$@}" ;; fail2ban ) shift 2 ; _docker_container fail2ban "${@:+$@}" ;;
show-mail-logs ) _docker_container cat /var/log/mail/mail.log ;; show-mail-logs ) _docker_container cat /var/log/mail/mail.log ;;
inspect ) _inspect ;; inspect ) _inspect ;;

View file

@ -21,7 +21,6 @@ trap "service postfix stop" SIGTERM
trap "service postfix reload" SIGHUP trap "service postfix reload" SIGHUP
service postfix start service postfix start
sleep 5
# wait until postfix is dead (triggered by trap) # wait until postfix is dead (triggered by trap)
while kill -0 "$(< /var/spool/postfix/pid/master.pid)" while kill -0 "$(< /var/spool/postfix/pid/master.pid)"

View file

@ -184,6 +184,7 @@ function teardown_file() {
} }
@test "checking spoofing: rejects sender forging" { @test "checking spoofing: rejects sender forging" {
wait_for_smtp_port_in_container_to_respond mail_with_ldap
run docker exec mail_with_ldap /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/ldap-smtp-auth-spoofed.txt | grep 'Sender address rejected: not owned by user'" run docker exec mail_with_ldap /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/ldap-smtp-auth-spoofed.txt | grep 'Sender address rejected: not owned by user'"
assert_success assert_success
} }

138
test/no_container.bats Normal file
View file

@ -0,0 +1,138 @@
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
load 'test_helper/common'
@test "[No Existing Container] checking setup.sh: setup.sh alias list" {
mkdir -p ./test/alias/config && echo "test@example.org test@forward.com" > ./test/alias/config/postfix-virtual.cf
run ./setup.sh -p ./test/alias/config alias list
assert_success
}
@test "[No Existing Container] checking setup.sh: setup.sh alias add" {
mkdir -p ./test/alias/config && echo "" > ./test/alias/config/postfix-virtual.cf
./setup.sh -p ./test/alias/config alias add alias@example.com target1@forward.com
./setup.sh -p ./test/alias/config alias add alias@example.com target2@forward.com
sleep 5
run /bin/sh -c 'cat ./test/alias/config/postfix-virtual.cf | grep "alias@example.com target1@forward.com,target2@forward.com" | wc -l | grep 1'
assert_success
}
@test "[No Existing Container] checking setup.sh: setup.sh alias del" {
# start with a1 -> t1,t2 and a2 -> t1
mkdir -p ./test/alias/config && echo -e 'alias1@example.org target1@forward.com,target2@forward.com\nalias2@example.org target1@forward.com' > ./test/alias/config/postfix-virtual.cf
# we remove a1 -> t1 ==> a1 -> t2 and a2 -> t1
./setup.sh -p ./test/alias/config alias del alias1@example.org target1@forward.com
run grep "target1@forward.com" ./test/alias/config/postfix-virtual.cf
assert_output --regexp "^alias2@example.org +target1@forward.com$"
run grep "target2@forward.com" ./test/alias/config/postfix-virtual.cf
assert_output --regexp "^alias1@example.org +target2@forward.com$"
# we remove a1 -> t2 ==> a2 -> t1
./setup.sh -p ./test/alias/config alias del alias1@example.org target2@forward.com
run grep "alias1@example.org" ./test/alias/config/postfix-virtual.cf
assert_failure
run grep "alias2@example.org" ./test/alias/config/postfix-virtual.cf
assert_success
# we remove a2 -> t1 ==> empty
./setup.sh -p ./test/alias/config alias del alias2@example.org target1@forward.com
run grep "alias2@example.org" ./test/alias/config/postfix-virtual.cf
assert_failure
}
# quota
@test "[No Existing Container] checking setup.sh: setup.sh setquota" {
mkdir -p ./test/quota/config && echo "" > ./test/quota/config/dovecot-quotas.cf
run ./setup.sh -p ./test/quota/config email add quota_user@example.com test_password
run ./setup.sh -p ./test/quota/config email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 12M
assert_success
run ./setup.sh -p ./test/quota/config quota set 51M quota_user@example.com
assert_failure
run ./setup.sh -p ./test/quota/config quota set unknown@domain.com 150M
assert_failure
run ./setup.sh -p ./test/quota/config quota set quota_user2 51M
assert_failure
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 26M
assert_success
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:26M\$" | wc -l | grep 1'
assert_success
run grep "quota_user2@example.com" ./test/alias/config/dovecot-quotas.cf
assert_failure
}
@test "[No Existing Container] checking setup.sh: setup.sh delquota" {
mkdir -p ./test/quota/config && echo "" > ./test/quota/config/dovecot-quotas.cf
run ./setup.sh -p ./test/quota/config email add quota_user@example.com test_password
run ./setup.sh -p ./test/quota/config email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 12M
assert_success
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success
run ./setup.sh -p ./test/quota/config quota del unknown@domain.com
assert_failure
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success
run ./setup.sh -p ./test/quota/config quota del quota_user@example.com
assert_success
run grep "quota_user@example.com" ./test/alias/config/dovecot-quotas.cf
assert_failure
}
# debug
@test "[No Existing Container] checking setup.sh: setup.sh relay add-domain" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-relaymap.cf
./setup.sh -p ./test/relay/config relay add-domain example1.org smtp.relay1.com 2525
./setup.sh -p ./test/relay/config relay add-domain example2.org smtp.relay2.com
./setup.sh -p ./test/relay/config relay add-domain example3.org smtp.relay3.com 2525
./setup.sh -p ./test/relay/config relay add-domain example3.org smtp.relay.com 587
# check adding
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example1.org\s\+\[smtp.relay1.com\]:2525" | wc -l | grep 1'
assert_success
# test default port
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example2.org\s\+\[smtp.relay2.com\]:25" | wc -l | grep 1'
assert_success
# test modifying
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example3.org\s\+\[smtp.relay.com\]:587" | wc -l | grep 1'
assert_success
}
@test "[No Existing Container] checking setup.sh: setup.sh relay add-auth" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-sasl-password.cf
./setup.sh -p ./test/relay/config relay add-auth example.org smtp_user smtp_pass
./setup.sh -p ./test/relay/config relay add-auth example2.org smtp_user2 smtp_pass2
./setup.sh -p ./test/relay/config relay add-auth example2.org smtp_user2 smtp_pass_new
# test adding
run /bin/sh -c 'cat ./test/relay/config/postfix-sasl-password.cf | grep -e "^@example.org\s\+smtp_user:smtp_pass" | wc -l | grep 1'
assert_success
# test updating
run /bin/sh -c 'cat ./test/relay/config/postfix-sasl-password.cf | grep -e "^@example2.org\s\+smtp_user2:smtp_pass_new" | wc -l | grep 1'
assert_success
}
@test "[No Existing Container] checking setup.sh: setup.sh relay exclude-domain" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-relaymap.cf
./setup.sh -p ./test/relay/config relay exclude-domain example.org
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example.org\s*$" | wc -l | grep 1'
assert_success
}

View file

@ -85,6 +85,20 @@ function wait_for_smtp_port_in_container() {
wait_for_tcp_port_in_container 25 "${1}" wait_for_tcp_port_in_container 25 "${1}"
} }
# @param ${1} name of the postfix container
function wait_for_smtp_port_in_container_to_respond() {
local COUNT=0
until [[ $(docker exec "${1}" timeout 10 /bin/sh -c "echo QUIT | nc localhost 25") == *"221 2.0.0 Bye"* ]]; do
if [[ $COUNT -eq 20 ]]
then
echo "Unable to receive a valid response from 'nc localhost 25' within 20 seconds"
return 1
fi
sleep 1
((COUNT+=1))
done
}
# @param ${1} name of the postfix container # @param ${1} name of the postfix container
function wait_for_amavis_port_in_container() { function wait_for_amavis_port_in_container() {
wait_for_tcp_port_in_container 10024 "${1}" wait_for_tcp_port_in_container 10024 "${1}"

View file

@ -1036,95 +1036,85 @@ EOF
# alias # alias
@test "checking setup.sh: setup.sh alias list" { @test "checking setup.sh: setup.sh alias list" {
mkdir -p ./test/alias/config && echo "test@example.org test@forward.com" > ./test/alias/config/postfix-virtual.cf run ./setup.sh alias list
run ./setup.sh -p ./test/alias/config alias list
assert_success assert_success
assert_output --partial "alias1@localhost.localdomain user1@localhost.localdomain"
assert_output --partial "@localdomain2.com user1@localhost.localdomain"
} }
@test "checking setup.sh: setup.sh alias add" { @test "checking setup.sh: setup.sh alias add" {
mkdir -p ./test/alias/config && echo "" > ./test/alias/config/postfix-virtual.cf ./setup.sh alias add alias@example.com target1@forward.com
./setup.sh -p ./test/alias/config alias add alias@example.com target1@forward.com ./setup.sh alias add alias@example.com target2@forward.com
./setup.sh -p ./test/alias/config alias add alias@example.com target2@forward.com ./setup.sh alias add alias2@example.org target3@forward.com
sleep 5 sleep 5
run /bin/sh -c 'cat ./test/alias/config/postfix-virtual.cf | grep "alias@example.com target1@forward.com,target2@forward.com" | wc -l | grep 1' run grep "alias@example.com target1@forward.com,target2@forward.com" "$(private_config_path mail)/postfix-virtual.cf"
assert_success assert_success
} }
@test "checking setup.sh: setup.sh alias del" { @test "checking setup.sh: setup.sh alias del" {
# start with a1 -> t1,t2 and a2 -> t1 ./setup.sh alias del alias@example.com target1@forward.com
mkdir -p ./test/alias/config && echo -e 'alias1@example.org target1@forward.com,target2@forward.com\nalias2@example.org target1@forward.com' > ./test/alias/config/postfix-virtual.cf run grep "target1@forward.com" "$(private_config_path mail)/postfix-virtual.cf"
# we remove a1 -> t1 ==> a1 -> t2 and a2 -> t1
./setup.sh -p ./test/alias/config alias del alias1@example.org target1@forward.com
run grep "target1@forward.com" ./test/alias/config/postfix-virtual.cf
assert_output --regexp "^alias2@example.org +target1@forward.com$"
run grep "target2@forward.com" ./test/alias/config/postfix-virtual.cf
assert_output --regexp "^alias1@example.org +target2@forward.com$"
# we remove a1 -> t2 ==> a2 -> t1
./setup.sh -p ./test/alias/config alias del alias1@example.org target2@forward.com
run grep "alias1@example.org" ./test/alias/config/postfix-virtual.cf
assert_failure assert_failure
run grep "alias2@example.org" ./test/alias/config/postfix-virtual.cf run grep "target2@forward.com" "$(private_config_path mail)/postfix-virtual.cf"
assert_output "alias@example.com target2@forward.com"
./setup.sh alias del alias@example.org target2@forward.com
run grep "alias@example.org" "$(private_config_path mail)/postfix-virtual.cf"
assert_failure
run grep "alias2@example.org" "$(private_config_path mail)/postfix-virtual.cf"
assert_success assert_success
# we remove a2 -> t1 ==> empty ./setup.sh alias del alias2@example.org target3@forward.com
./setup.sh -p ./test/alias/config alias del alias2@example.org target1@forward.com run grep "alias2@example.org" "$(private_config_path mail)/postfix-virtual.cf"
run grep "alias2@example.org" ./test/alias/config/postfix-virtual.cf
assert_failure assert_failure
} }
# quota # quota
@test "checking setup.sh: setup.sh setquota" { @test "checking setup.sh: setup.sh setquota" {
mkdir -p ./test/quota/config && echo "" > ./test/quota/config/dovecot-quotas.cf run ./setup.sh email add quota_user@example.com test_password
run ./setup.sh email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config email add quota_user@example.com test_password run ./setup.sh quota set quota_user@example.com 12M
run ./setup.sh -p ./test/quota/config email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 12M
assert_success assert_success
run ./setup.sh -p ./test/quota/config quota set 51M quota_user@example.com run ./setup.sh quota set 51M quota_user@example.com
assert_failure assert_failure
run ./setup.sh -p ./test/quota/config quota set unknown@domain.com 150M run ./setup.sh quota set unknown@domain.com 150M
assert_failure assert_failure
run ./setup.sh -p ./test/quota/config quota set quota_user2 51M run ./setup.sh quota set quota_user2 51M
assert_failure assert_failure
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1' run /bin/sh -c 'cat ./test/duplicate_configs/mail/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success assert_success
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 26M run ./setup.sh quota set quota_user@example.com 26M
assert_success assert_success
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:26M\$" | wc -l | grep 1' run /bin/sh -c 'cat ./test/duplicate_configs/mail/dovecot-quotas.cf | grep -E "^quota_user@example.com\:26M\$" | wc -l | grep 1'
assert_success assert_success
run grep "quota_user2@example.com" ./test/alias/config/dovecot-quotas.cf run grep "quota_user2@example.com" ./test/duplicate_configs/mail/dovecot-quotas.cf
assert_failure assert_failure
} }
@test "checking setup.sh: setup.sh delquota" { @test "checking setup.sh: setup.sh delquota" {
mkdir -p ./test/quota/config && echo "" > ./test/quota/config/dovecot-quotas.cf run ./setup.sh email add quota_user@example.com test_password
run ./setup.sh email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config email add quota_user@example.com test_password run ./setup.sh quota set quota_user@example.com 12M
run ./setup.sh -p ./test/quota/config email add quota_user2@example.com test_password
run ./setup.sh -p ./test/quota/config quota set quota_user@example.com 12M
assert_success assert_success
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1' run /bin/sh -c 'cat ./test/duplicate_configs/mail/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success assert_success
run ./setup.sh quota del unknown@domain.com
run ./setup.sh -p ./test/quota/config quota del unknown@domain.com
assert_failure assert_failure
run /bin/sh -c 'cat ./test/quota/config/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1' run /bin/sh -c 'cat ./test/duplicate_configs/mail/dovecot-quotas.cf | grep -E "^quota_user@example.com\:12M\$" | wc -l | grep 1'
assert_success assert_success
run ./setup.sh -p ./test/quota/config quota del quota_user@example.com run ./setup.sh quota del quota_user@example.com
assert_success assert_success
run grep "quota_user@example.com" ./test/alias/config/dovecot-quotas.cf run grep "quota_user@example.com" ./test/duplicate_configs/mail/dovecot-quotas.cf
assert_failure assert_failure
} }
@ -1152,42 +1142,39 @@ EOF
} }
@test "checking setup.sh: setup.sh relay add-domain" { @test "checking setup.sh: setup.sh relay add-domain" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-relaymap.cf ./setup.sh relay add-domain example1.org smtp.relay1.com 2525
./setup.sh -p ./test/relay/config relay add-domain example1.org smtp.relay1.com 2525 ./setup.sh relay add-domain example2.org smtp.relay2.com
./setup.sh -p ./test/relay/config relay add-domain example2.org smtp.relay2.com ./setup.sh relay add-domain example3.org smtp.relay3.com 2525
./setup.sh -p ./test/relay/config relay add-domain example3.org smtp.relay3.com 2525 ./setup.sh relay add-domain example3.org smtp.relay.com 587
./setup.sh -p ./test/relay/config relay add-domain example3.org smtp.relay.com 587
# check adding # check adding
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example1.org\s\+\[smtp.relay1.com\]:2525" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-relaymap.cf | grep -e \"^@example1.org\s\+\[smtp.relay1.com\]:2525\" | wc -l | grep 1"
assert_success assert_success
# test default port # test default port
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example2.org\s\+\[smtp.relay2.com\]:25" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-relaymap.cf | grep -e \"^@example2.org\s\+\[smtp.relay2.com\]:25\" | wc -l | grep 1"
assert_success assert_success
# test modifying # test modifying
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example3.org\s\+\[smtp.relay.com\]:587" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-relaymap.cf | grep -e \"^@example3.org\s\+\[smtp.relay.com\]:587\" | wc -l | grep 1"
assert_success assert_success
} }
@test "checking setup.sh: setup.sh relay add-auth" { @test "checking setup.sh: setup.sh relay add-auth" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-sasl-password.cf ./setup.sh relay add-auth example.org smtp_user smtp_pass
./setup.sh -p ./test/relay/config relay add-auth example.org smtp_user smtp_pass ./setup.sh relay add-auth example2.org smtp_user2 smtp_pass2
./setup.sh -p ./test/relay/config relay add-auth example2.org smtp_user2 smtp_pass2 ./setup.sh relay add-auth example2.org smtp_user2 smtp_pass_new
./setup.sh -p ./test/relay/config relay add-auth example2.org smtp_user2 smtp_pass_new
# test adding # test adding
run /bin/sh -c 'cat ./test/relay/config/postfix-sasl-password.cf | grep -e "^@example.org\s\+smtp_user:smtp_pass" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-sasl-password.cf | grep -e \"^@example.org\s\+smtp_user:smtp_pass\" | wc -l | grep 1"
assert_success assert_success
# test updating # test updating
run /bin/sh -c 'cat ./test/relay/config/postfix-sasl-password.cf | grep -e "^@example2.org\s\+smtp_user2:smtp_pass_new" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-sasl-password.cf | grep -e \"^@example2.org\s\+smtp_user2:smtp_pass_new\" | wc -l | grep 1"
assert_success assert_success
} }
@test "checking setup.sh: setup.sh relay exclude-domain" { @test "checking setup.sh: setup.sh relay exclude-domain" {
mkdir -p ./test/relay/config && echo -n > ./test/relay/config/postfix-relaymap.cf ./setup.sh relay exclude-domain example.org
./setup.sh -p ./test/relay/config relay exclude-domain example.org
run /bin/sh -c 'cat ./test/relay/config/postfix-relaymap.cf | grep -e "^@example.org\s*$" | wc -l | grep 1' run /bin/sh -c "cat $(private_config_path mail)/postfix-relaymap.cf | grep -e \"^@example.org\s*$\" | wc -l | grep 1"
assert_success assert_success
} }
@ -1204,12 +1191,12 @@ EOF
@test "checking spoofing: rejects sender forging" { @test "checking spoofing: rejects sender forging" {
# checking rejection of spoofed sender # checking rejection of spoofed sender
wait_for_smtp_port_in_container_to_respond mail
run docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-spoofed.txt" run docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-spoofed.txt"
assert_output --partial 'Sender address rejected: not owned by user' assert_output --partial 'Sender address rejected: not owned by user'
} }
@test "checking spoofing: accepts sending as alias" { @test "checking spoofing: accepts sending as alias" {
run docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-spoofed-alias.txt | grep 'End data with'" run docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-spoofed-alias.txt | grep 'End data with'"
assert_success assert_success
} }