2022-11-25 22:37:58 +00:00
|
|
|
load "${REPOSITORY_ROOT}/test/test_helper/common"
|
2019-08-07 00:24:56 +00:00
|
|
|
|
|
|
|
NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME=non-default-docker-mail-network
|
2022-02-09 09:25:09 +00:00
|
|
|
setup_file() {
|
2022-05-30 00:53:30 +00:00
|
|
|
docker network create --driver bridge "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}"
|
|
|
|
docker network create --driver bridge "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2"
|
|
|
|
|
|
|
|
# use two networks (default ("bridge") and our custom network) to recreate problematic test case where PERMIT_DOCKER=host would not help
|
|
|
|
# currently we cannot use --network in `docker run` multiple times, it will just use the last one
|
|
|
|
# instead we need to use create, network connect and start (see https://success.docker.com/article/multiple-docker-networks)
|
|
|
|
local PRIVATE_CONFIG
|
|
|
|
|
|
|
|
PRIVATE_CONFIG=$(duplicate_config_for_container . mail_smtponly_second_network)
|
|
|
|
docker create --name mail_smtponly_second_network \
|
|
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
|
|
-e SMTP_ONLY=1 \
|
|
|
|
-e PERMIT_DOCKER=connected-networks \
|
|
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
|
|
--network "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}" \
|
|
|
|
-t "${NAME}"
|
|
|
|
|
|
|
|
docker network connect "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2" mail_smtponly_second_network
|
|
|
|
docker start mail_smtponly_second_network
|
|
|
|
|
|
|
|
PRIVATE_CONFIG=$(duplicate_config_for_container . mail_smtponly_second_network_sender)
|
|
|
|
docker run -d --name mail_smtponly_second_network_sender \
|
|
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
|
|
-e SMTP_ONLY=1 \
|
|
|
|
-e PERMIT_DOCKER=connected-networks \
|
|
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
|
|
--network "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2" \
|
|
|
|
-t "${NAME}"
|
|
|
|
|
|
|
|
# wait until postfix is up
|
|
|
|
wait_for_smtp_port_in_container mail_smtponly_second_network
|
|
|
|
|
|
|
|
# create another container that enforces authentication even on local connections
|
|
|
|
docker run -d --name mail_smtponly_force_authentication \
|
|
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
|
|
-e SMTP_ONLY=1 \
|
|
|
|
-e PERMIT_DOCKER=none \
|
|
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
|
|
-t "${NAME}"
|
|
|
|
|
|
|
|
# wait until postfix is up
|
|
|
|
wait_for_smtp_port_in_container mail_smtponly_force_authentication
|
2019-08-07 00:24:56 +00:00
|
|
|
}
|
|
|
|
|
2022-02-09 09:25:09 +00:00
|
|
|
teardown_file() {
|
2022-05-30 00:53:30 +00:00
|
|
|
docker logs mail_smtponly_second_network
|
|
|
|
docker rm -f mail_smtponly_second_network mail_smtponly_second_network_sender mail_smtponly_force_authentication
|
|
|
|
docker network rm "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}" "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2"
|
2019-08-07 00:24:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@test "checking PERMIT_DOCKER: connected-networks" {
|
2020-11-05 12:32:42 +00:00
|
|
|
IPNET1=$(docker network inspect --format '{{(index .IPAM.Config 0).Subnet}}' non-default-docker-mail-network)
|
|
|
|
IPNET2=$(docker network inspect --format '{{(index .IPAM.Config 0).Subnet}}' non-default-docker-mail-network2)
|
2019-08-07 19:45:52 +00:00
|
|
|
run docker exec mail_smtponly_second_network /bin/sh -c "postconf | grep '^mynetworks ='"
|
2020-11-05 12:32:42 +00:00
|
|
|
assert_output --partial "${IPNET1}"
|
|
|
|
assert_output --partial "${IPNET2}"
|
2019-08-07 19:45:52 +00:00
|
|
|
|
2022-08-29 11:26:44 +00:00
|
|
|
run docker exec mail_smtponly_second_network /bin/sh -c "postconf smtp_host_lookup=no"
|
2019-08-07 00:24:56 +00:00
|
|
|
assert_success
|
2022-05-30 00:53:30 +00:00
|
|
|
|
2023-01-12 21:10:58 +00:00
|
|
|
_reload_postfix mail_smtponly_second_network
|
2022-05-30 00:53:30 +00:00
|
|
|
|
2019-08-07 00:24:56 +00:00
|
|
|
# we should be able to send from the other container on the second network!
|
|
|
|
run docker exec mail_smtponly_second_network_sender /bin/sh -c "nc mail_smtponly_second_network 25 < /tmp/docker-mailserver-test/email-templates/smtp-only.txt"
|
|
|
|
assert_output --partial "250 2.0.0 Ok: queued as "
|
refactor: Parallel Tests
- `disabled_clamav_spamassassin`:
- Just shuffling the test order around, and removing the restart test at the end which doesn't make sense.
- `postscreen`:
- Now uses common helper for getting container IP
- Does not appear to need the `NET_ADMIN` capability?
- Reduced startup time for the 2nd container + additional context about it's relevance.
- Test cases are largely the same, but refactored the `nc` alternative that properly waits it's turn. This only needs to run once. Added additional commentary and made into a generic method if needed in other tests.
- `fail2ban`:
- Use the common container IP helper method.
- Postscreen isn't affecting this test, it's not required to do the much slower exchange with the mail server when sending a login failure.
- IP being passed into ENV is no longer necessary.
- `sleep 5` in the related test cases doesn't seem necessary, can better rely on polling with timeout.
- `sleep 10` for `setup.sh` also doesn't appear to be necessary.
- `postgrey`:
- Reduced POSTGREY_DELAY to 3, which shaves a fair amount of wasted time while still verifying the delay works.
- One of the checks in `main.cf` doesn't seem to need to know about the earlier spamhaus portion of the line to work, removed.
- Better test case descriptions.
- Improved log matching via standard method that better documents the expected triplet under test.
- Removed a redundant whitelist file and test that didn't seem to have any relevance. Added a TODO with additional notes about a concern with these tests.
- Reduced test time as 8 second timeouts from `-w 8` don't appear to be required, better to poll with grep instead.
- Replaced `wc -l` commands with a new method to assert expected line count, better enabling assertions on the actual output.
- `undef_spam_subject`:
- Split to two separate test cases, and initialize each container in their case instead of `setup_file()`, allowing for using the default `teardown()` method (and slight benefit if running in parallel).
- `permit_docker`:
- Not a parallel test, but I realized that the repeat helper methods don't necessarily play well with `run` as the command (can cause false positive of what was successful).
2023-01-03 06:11:36 +00:00
|
|
|
repeat_in_container_until_success_or_timeout 60 mail_smtponly_second_network /bin/sh -c 'grep -cE "to=<user2\@external.tld>.*status\=sent" /var/log/mail/mail.log'
|
2020-10-19 11:13:42 +00:00
|
|
|
}
|
2022-02-09 09:25:09 +00:00
|
|
|
|
|
|
|
@test "checking PERMIT_DOCKER: none" {
|
2022-08-29 11:26:44 +00:00
|
|
|
run docker exec mail_smtponly_force_authentication /bin/sh -c "postconf smtp_host_lookup=no"
|
2022-02-09 09:25:09 +00:00
|
|
|
assert_success
|
2022-05-30 00:53:30 +00:00
|
|
|
|
2023-01-12 21:10:58 +00:00
|
|
|
_reload_postfix mail_smtponly_force_authentication
|
2022-05-30 00:53:30 +00:00
|
|
|
|
2022-02-09 09:25:09 +00:00
|
|
|
# the mailserver should require authentication and a protocol error should occur when using TLS
|
|
|
|
run docker exec mail_smtponly_force_authentication /bin/sh -c "nc localhost 25 < /tmp/docker-mailserver-test/email-templates/smtp-only.txt"
|
|
|
|
assert_output --partial "550 5.5.1 Protocol error"
|
|
|
|
[[ ${status} -ge 0 ]]
|
|
|
|
}
|
2023-01-24 08:21:39 +00:00
|
|
|
|
|
|
|
@test "checking PERMIT_DOCKER=network: opendmarc/opendkim config" {
|
|
|
|
skip 'TODO: this test was taken from mail_smtponly, where it did not actually belong to'
|
|
|
|
run docker exec mail_smtponly /bin/sh -c "cat /etc/opendmarc/ignore.hosts | grep '172.16.0.0/12'"
|
|
|
|
assert_success
|
|
|
|
|
|
|
|
run docker exec mail_smtponly /bin/sh -c "cat /etc/opendkim/TrustedHosts | grep '172.16.0.0/12'"
|
|
|
|
assert_success
|
|
|
|
}
|