Merge remote-tracking branch 'upstream/master'

This commit is contained in:
hanscees 2024-01-28 21:52:12 +01:00
commit cb585d3f8c
14 changed files with 230 additions and 139 deletions

View File

@ -23,14 +23,13 @@ jobs:
# Restore workflow context #
# ======================== #
# The official Github Action for downloading artifacts does not support multi-workflow
# Retrieve the artifact uploaded from `docs-preview-prepare.yml` workflow run that triggered this deployment
- name: 'Download build artifact'
uses: dawidd6/action-download-artifact@v3
uses: actions/download-artifact@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
run_id: ${{ github.event.workflow_run.id }}
workflow: docs-preview-prepare.yml
name: preview-build
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
- name: 'Extract build artifact'
run: tar -xf artifact.tar.zst

View File

@ -24,6 +24,11 @@ The most noteworthy change of this release is the update of the container's base
- The script now uses `/etc/os-release` to determine the release name of Debian
- Removed custom installations of Fail2Ban, getmail6 and Rspamd
- Updated packages lists and added comments for maintainability
- OpenDMARC upgrade: `v1.4.0` => `v1.4.2` ([#3841](https://github.com/docker-mailserver/docker-mailserver/pull/3841))
- Previous versions of OpenDMARC would place incoming mail from domains announcing `p=quarantaine` (_that fail the DMARC check_) into the [Postfix "hold" queue](https://www.postfix.org/QSHAPE_README.html#hold_queue) until administrative intervention.
- [OpenDMARC v1.4.2 has disabled that feature by default](https://github.com/trusteddomainproject/OpenDMARC/issues/105), but it can be enabled again by adding the setting `HoldQuarantinedMessages true` to [`/etc/opendmarc.conf`](https://github.com/docker-mailserver/docker-mailserver/blob/v13.3.1/target/opendmarc/opendmarc.conf) (_provided from DMS_).
- [Our `user-patches.sh` feature](https://docker-mailserver.github.io/docker-mailserver/latest/config/advanced/override-defaults/user-patches/) provides a convenient approach to updating that config file.
- Please let us know if you disagree with the upstream default being carried with DMS, or the value of providing alternative configuration support within DMS.
- **Postfix:**
- Postfix upgrade from 3.5 to 3.7 ([#3403](https://github.com/docker-mailserver/docker-mailserver/pull/3403))
- `compatibility_level` was raised from `2` to `3.6`
@ -38,6 +43,11 @@ The most noteworthy change of this release is the update of the container's base
- **Tests:**
- Refactored helper methods for sending e-mails with specific `Message-ID` headers and the helpers for retrieving + filtering logs, which together help isolate logs relevant to specific mail when multiple mails have been processed within a single test. ([#3786](https://github.com/docker-mailserver/docker-mailserver/pull/3786))
### Fixes
- DMS config files that are parsed line by line are now more robust to parse by detecting and fixing line-endings ([#3819](https://github.com/docker-mailserver/docker-mailserver/pull/3819))
- Variables related to Rspamd are declared as `readonly`, which would cause warnings in the log when being re-declared; we now guard against this issue ([#3837](https://github.com/docker-mailserver/docker-mailserver/pull/3837))
## [v13.3.1](https://github.com/docker-mailserver/docker-mailserver/releases/tag/v13.3.1)
### Fixes

View File

@ -134,13 +134,6 @@ Thanks goes to these wonderful people ✨
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/alinmear">
<img src="https://avatars.githubusercontent.com/u/1282224?v=4" width="100;" alt="alinmear"/>
<br />
<sub><b>alinmear</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/ap-wtioit">
<img src="https://avatars.githubusercontent.com/u/38032588?v=4" width="100;" alt="ap-wtioit"/>
@ -148,6 +141,13 @@ Thanks goes to these wonderful people ✨
<sub><b>ap-wtioit</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/alinmear">
<img src="https://avatars.githubusercontent.com/u/1282224?v=4" width="100;" alt="alinmear"/>
<br />
<sub><b>alinmear</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/dominikwinter">
<img src="https://avatars.githubusercontent.com/u/2269503?v=4" width="100;" alt="dominikwinter"/>
@ -815,13 +815,20 @@ Thanks goes to these wonderful people ✨
</a>
</td>
<td align="center">
<a href="https://github.com/nilshoell">
<img src="https://avatars.githubusercontent.com/u/33981934?v=4" width="100;" alt="nilshoell"/>
<a href="https://github.com/auchri">
<img src="https://avatars.githubusercontent.com/u/5092164?v=4" width="100;" alt="auchri"/>
<br />
<sub><b>nilshoell</b></sub>
<sub><b>auchri</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/stephan-devop">
<img src="https://avatars.githubusercontent.com/u/59093905?v=4" width="100;" alt="stephan-devop"/>
<br />
<sub><b>stephan-devop</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/stigok">
<img src="https://avatars.githubusercontent.com/u/952936?v=4" width="100;" alt="stigok"/>
@ -856,15 +863,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>TechnicLab</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/thomasschmit">
<img src="https://avatars.githubusercontent.com/u/6014433?v=4" width="100;" alt="thomasschmit"/>
<br />
<sub><b>thomasschmit</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Thiritin">
<img src="https://avatars.githubusercontent.com/u/6755282?v=4" width="100;" alt="Thiritin"/>
@ -899,15 +906,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>Twist235</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/k3it">
<img src="https://avatars.githubusercontent.com/u/9923389?v=4" width="100;" alt="k3it"/>
<br />
<sub><b>k3it</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Drakulix">
<img src="https://avatars.githubusercontent.com/u/4404502?v=4" width="100;" alt="Drakulix"/>
@ -942,15 +949,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>Zepmann</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/allddd">
<img src="https://avatars.githubusercontent.com/u/117767298?v=4" width="100;" alt="allddd"/>
<br />
<sub><b>allddd</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/nilshoell">
<img src="https://avatars.githubusercontent.com/u/33981934?v=4" width="100;" alt="nilshoell"/>
<br />
<sub><b>nilshoell</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/nknapp">
<img src="https://avatars.githubusercontent.com/u/636150?v=4" width="100;" alt="nknapp"/>
@ -985,15 +992,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>mrPjer</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/p3dda">
<img src="https://avatars.githubusercontent.com/u/2871413?v=4" width="100;" alt="p3dda"/>
<br />
<sub><b>p3dda</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/peter-hartmann">
<img src="https://avatars.githubusercontent.com/u/20216585?v=4" width="100;" alt="peter-hartmann"/>
@ -1028,15 +1035,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>norrs</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/MightySCollins">
<img src="https://avatars.githubusercontent.com/u/8594759?v=4" width="100;" alt="MightySCollins"/>
<br />
<sub><b>MightySCollins</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/501st-alpha1">
<img src="https://avatars.githubusercontent.com/u/676533?v=4" width="100;" alt="501st-alpha1"/>
@ -1071,15 +1078,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>shyim</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/sjmudd">
<img src="https://avatars.githubusercontent.com/u/116250?v=4" width="100;" alt="sjmudd"/>
<br />
<sub><b>sjmudd</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/simonsystem">
<img src="https://avatars.githubusercontent.com/u/5014686?v=4" width="100;" alt="simonsystem"/>
@ -1088,10 +1095,10 @@ Thanks goes to these wonderful people ✨
</a>
</td>
<td align="center">
<a href="https://github.com/stephan-devop">
<img src="https://avatars.githubusercontent.com/u/59093905?v=4" width="100;" alt="stephan-devop"/>
<a href="https://github.com/allddd">
<img src="https://avatars.githubusercontent.com/u/117767298?v=4" width="100;" alt="allddd"/>
<br />
<sub><b>stephan-devop</b></sub>
<sub><b>allddd</b></sub>
</a>
</td>
<td align="center">
@ -1114,15 +1121,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>odinis</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/okamidash">
<img src="https://avatars.githubusercontent.com/u/43506079?v=4" width="100;" alt="okamidash"/>
<br />
<sub><b>okamidash</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/olaf-mandel">
<img src="https://avatars.githubusercontent.com/u/918687?v=4" width="100;" alt="olaf-mandel"/>
@ -1157,15 +1164,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>rhyst</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/rmlhuk">
<img src="https://avatars.githubusercontent.com/u/7514163?v=4" width="100;" alt="rmlhuk"/>
<br />
<sub><b>rmlhuk</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/rriski">
<img src="https://avatars.githubusercontent.com/u/25483483?v=4" width="100;" alt="rriski"/>
@ -1200,15 +1207,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>squash</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/strarsis">
<img src="https://avatars.githubusercontent.com/u/9271436?v=4" width="100;" alt="strarsis"/>
<br />
<sub><b>strarsis</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/tamueller">
<img src="https://avatars.githubusercontent.com/u/1902960?v=4" width="100;" alt="tamueller"/>
@ -1243,15 +1250,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>worldworm</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/arcaine2">
<img src="https://avatars.githubusercontent.com/u/12737015?v=4" width="100;" alt="arcaine2"/>
<br />
<sub><b>arcaine2</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/awb99">
<img src="https://avatars.githubusercontent.com/u/10854682?v=4" width="100;" alt="awb99"/>
@ -1286,15 +1293,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>dimalo</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/eleith">
<img src="https://avatars.githubusercontent.com/u/284832?v=4" width="100;" alt="eleith"/>
<br />
<sub><b>eleith</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/ghnp5">
<img src="https://avatars.githubusercontent.com/u/57591332?v=4" width="100;" alt="ghnp5"/>
@ -1329,15 +1336,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>idaadi</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/ixeft">
<img src="https://avatars.githubusercontent.com/u/422722?v=4" width="100;" alt="ixeft"/>
<br />
<sub><b>ixeft</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/jjtt">
<img src="https://avatars.githubusercontent.com/u/3908945?v=4" width="100;" alt="jjtt"/>
@ -1372,15 +1379,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>callmemagnus</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/marios88">
<img src="https://avatars.githubusercontent.com/u/302688?v=4" width="100;" alt="marios88"/>
<br />
<sub><b>marios88</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/matrixes">
<img src="https://avatars.githubusercontent.com/u/46491408?v=4" width="100;" alt="matrixes"/>
@ -1395,13 +1402,6 @@ Thanks goes to these wonderful people ✨
<sub><b>mchamplain</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/auchri">
<img src="https://avatars.githubusercontent.com/u/5092164?v=4" width="100;" alt="auchri"/>
<br />
<sub><b>auchri</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/arkanovicz">
<img src="https://avatars.githubusercontent.com/u/475277?v=4" width="100;" alt="arkanovicz"/>
@ -1539,10 +1539,10 @@ Thanks goes to these wonderful people ✨
</a>
</td>
<td align="center">
<a href="https://github.com/thechubbypanda">
<img src="https://avatars.githubusercontent.com/u/33595996?v=4" width="100;" alt="thechubbypanda"/>
<a href="https://github.com/froks">
<img src="https://avatars.githubusercontent.com/u/734686?v=4" width="100;" alt="froks"/>
<br />
<sub><b>thechubbypanda</b></sub>
<sub><b>froks</b></sub>
</a>
</td>
<td align="center">
@ -1696,6 +1696,13 @@ Thanks goes to these wonderful people ✨
<sub><b>crash7</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/thechubbypanda">
<img src="https://avatars.githubusercontent.com/u/33595996?v=4" width="100;" alt="thechubbypanda"/>
<br />
<sub><b>thechubbypanda</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/KCrawley">
<img src="https://avatars.githubusercontent.com/u/60195478?v=4" width="100;" alt="KCrawley"/>
@ -1716,15 +1723,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>JustAnother1</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/LeoWinterDE">
<img src="https://avatars.githubusercontent.com/u/1300141?v=4" width="100;" alt="LeoWinterDE"/>
<br />
<sub><b>LeoWinterDE</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/linhandev">
<img src="https://avatars.githubusercontent.com/u/29757093?v=4" width="100;" alt="linhandev"/>
@ -1759,15 +1766,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>madmath03</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/maxemann96">
<img src="https://avatars.githubusercontent.com/u/4399206?v=4" width="100;" alt="maxemann96"/>
<br />
<sub><b>maxemann96</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/dragetd">
<img src="https://avatars.githubusercontent.com/u/3639577?v=4" width="100;" alt="dragetd"/>
@ -1802,15 +1809,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>mcchots</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/MohammedNoureldin">
<img src="https://avatars.githubusercontent.com/u/14913147?v=4" width="100;" alt="MohammedNoureldin"/>
<br />
<sub><b>MohammedNoureldin</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/mpldr">
<img src="https://avatars.githubusercontent.com/u/33086936?v=4" width="100;" alt="mpldr"/>
@ -1839,13 +1846,6 @@ Thanks goes to these wonderful people ✨
<sub><b>radicand</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/froks">
<img src="https://avatars.githubusercontent.com/u/734686?v=4" width="100;" alt="froks"/>
<br />
<sub><b>froks</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/fkefer">
<img src="https://avatars.githubusercontent.com/u/1140674?v=4" width="100;" alt="fkefer"/>
@ -1911,6 +1911,13 @@ Thanks goes to these wonderful people ✨
<sub><b>Influencer</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/JamBalaya56562">
<img src="https://avatars.githubusercontent.com/u/88115388?v=4" width="100;" alt="JamBalaya56562"/>
<br />
<sub><b>JamBalaya56562</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/jcalfee">
<img src="https://avatars.githubusercontent.com/u/204121?v=4" width="100;" alt="jcalfee"/>
@ -1931,15 +1938,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>init-js</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Jeidnx">
<img src="https://avatars.githubusercontent.com/u/55414029?v=4" width="100;" alt="Jeidnx"/>
<br />
<sub><b>Jeidnx</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/JiLleON">
<img src="https://avatars.githubusercontent.com/u/28780165?v=4" width="100;" alt="JiLleON"/>
@ -1974,15 +1981,15 @@ Thanks goes to these wonderful people ✨
<br />
<sub><b>JOduMonT</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Kaan88">
<img src="https://avatars.githubusercontent.com/u/1260152?v=4" width="100;" alt="Kaan88"/>
<br />
<sub><b>Kaan88</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/akkumar">
<img src="https://avatars.githubusercontent.com/u/38454?v=4" width="100;" alt="akkumar"/>

View File

@ -4,22 +4,27 @@
[ci::status]: https://img.shields.io/github/actions/workflow/status/docker-mailserver/docker-mailserver/default_on_push.yml?branch=master&color=blue&label=CI&logo=github&logoColor=white&style=for-the-badge
[ci::github]: https://github.com/docker-mailserver/docker-mailserver/actions
[docker::pulls]: https://img.shields.io/docker/pulls/mailserver/docker-mailserver.svg?style=for-the-badge&logo=docker&logoColor=white
[docker::pulls]: https://img.shields.io/docker/pulls/mailserver/docker-mailserver.svg?style=for-the-badge&logo=docker&logoColor=white&color=blue
[docker::hub]: https://hub.docker.com/r/mailserver/docker-mailserver/
[documentation::badge]: https://img.shields.io/badge/DOCUMENTATION-GH%20PAGES-0078D4?style=for-the-badge&logo=git&logoColor=white
[documentation::badge]: https://img.shields.io/badge/DOCUMENTATION-GH%20PAGES-0078D4?style=for-the-badge&logo=googledocs&logoColor=white
[documentation::web]: https://docker-mailserver.github.io/docker-mailserver/latest/
## :page_with_curl: About
A production-ready fullstack but simple containerized mail server (SMTP, IMAP, LDAP, Anti-spam, Anti-virus, etc.). Only configuration files, no SQL database. Keep it simple and versioned. Easy to deploy and upgrade. Originally created by @tomav, this project is now maintained by volunteers since January 2021.
A production-ready fullstack but simple containerized mail server (SMTP, IMAP, LDAP, Anti-spam, Anti-virus, etc.).
- Only configuration files, no SQL database. Keep it simple and versioned. Easy to deploy and upgrade.
- Originally created by [@tomav](https://github.com/tomav), this project is now maintained by volunteers since January 2021.
## :bulb: Documentation
## <!-- Adds a thin line break separator style -->
We provide a [dedicated documentation][documentation::web] hosted on GitHub Pages. Make sure to read it as it contains all the information necessary to set up and configure your mail server. The documentation is crafted with Markdown & [MkDocs Material](https://squidfunk.github.io/mkdocs-material/).
> [!TIP]
> Be sure to read [our documentation][documentation::web]. It provides guidance on initial setup of your mail server.
## :boom: Issues
If you have issues, please search through [the documentation][documentation::web] **for your version** before opening an issue. The issue tracker is for issues, not for personal support. Make sure the version of the documentation matches the image version you're using!
> [!IMPORTANT]
> If you have issues, please search through [the documentation][documentation::web] **for your version** before opening an issue.
>
> The issue tracker is for issues, not for personal support.
> Make sure the version of the documentation matches the image version you're using!
## :link: Links to Useful Resources

View File

@ -102,3 +102,8 @@ div.md-content article.md-content__inner a.toclink code {
.highlight.no-copy .md-clipboard { display: none; }
/* ============================================================================================================= */
/* Make the left-sidebar nav categories better distinguished from page links (bold text) */
.md-nav__item--nested > .md-nav__link {
font-weight: 700;
}

View File

@ -46,6 +46,8 @@ pickup fifo n - n 60 1 pickup
-o content_filter=
-o receive_override_options=no_header_body_checks
# This relates to submission(s) services defined above:
# https://www.postfix.org/BUILTIN_FILTER_README.html#mx_submission
sender-cleanup unix n - n - 0 cleanup
-o syslog_name=postfix/sender-cleanup
-o header_checks=pcre:/etc/postfix/maps/sender_header_filter.pcre

View File

@ -19,16 +19,9 @@ function _create_accounts() {
_create_masters
if [[ -f ${DATABASE_ACCOUNTS} ]]; then
_log 'trace' "Checking file line endings"
sed -i 's|\r||g' "${DATABASE_ACCOUNTS}"
_log 'trace' "Regenerating postfix user list"
echo "# WARNING: this file is auto-generated. Modify ${DATABASE_ACCOUNTS} to edit the user list." > /etc/postfix/vmailbox
# checking that ${DATABASE_ACCOUNTS} ends with a newline
# shellcheck disable=SC1003
sed -i -e '$a\' "${DATABASE_ACCOUNTS}"
chown dovecot:dovecot "${DOVECOT_USERDB_FILE}"
chmod 640 "${DOVECOT_USERDB_FILE}"
@ -158,15 +151,8 @@ function _create_masters() {
local DATABASE_DOVECOT_MASTERS='/tmp/docker-mailserver/dovecot-masters.cf'
if [[ -f ${DATABASE_DOVECOT_MASTERS} ]]; then
_log 'trace' "Checking file line endings"
sed -i 's|\r||g' "${DATABASE_DOVECOT_MASTERS}"
_log 'trace' "Regenerating dovecot masters list"
# checking that ${DATABASE_DOVECOT_MASTERS} ends with a newline
# shellcheck disable=SC1003
sed -i -e '$a\' "${DATABASE_DOVECOT_MASTERS}"
chown dovecot:dovecot "${DOVECOT_MASTERDB_FILE}"
chmod 640 "${DOVECOT_MASTERDB_FILE}"

View File

@ -12,11 +12,6 @@ function _handle_postfix_virtual_config() {
local DATABASE_VIRTUAL=/tmp/docker-mailserver/postfix-virtual.cf
if [[ -f ${DATABASE_VIRTUAL} ]]; then
# fixing old virtual user file
if grep -q ",$" "${DATABASE_VIRTUAL}"; then
sed -i -e "s|, |,|g" -e "s|,$||g" "${DATABASE_VIRTUAL}"
fi
cp -f "${DATABASE_VIRTUAL}" /etc/postfix/virtual
else
_log 'debug' "'${DATABASE_VIRTUAL}' not provided - no mail alias/forward created"

View File

@ -15,14 +15,19 @@ function __do_as_rspamd_user() {
# they cannot be modified. Use this function when you require common directory
# names, file names, etc.
function _rspamd_get_envs() {
readonly RSPAMD_LOCAL_D='/etc/rspamd/local.d'
readonly RSPAMD_OVERRIDE_D='/etc/rspamd/override.d'
# If the variables are already set, we cannot set them again as they are declared
# with `readonly`. Checking whether one is declared suffices, because either all
# are declared at once, or none.
if [[ ! -v RSPAMD_LOCAL_D ]]; then
readonly RSPAMD_LOCAL_D='/etc/rspamd/local.d'
readonly RSPAMD_OVERRIDE_D='/etc/rspamd/override.d'
readonly RSPAMD_DMS_D='/tmp/docker-mailserver/rspamd'
readonly RSPAMD_DMS_DKIM_D="${RSPAMD_DMS_D}/dkim"
readonly RSPAMD_DMS_OVERRIDE_D="${RSPAMD_DMS_D}/override.d"
readonly RSPAMD_DMS_D='/tmp/docker-mailserver/rspamd'
readonly RSPAMD_DMS_DKIM_D="${RSPAMD_DMS_D}/dkim"
readonly RSPAMD_DMS_OVERRIDE_D="${RSPAMD_DMS_D}/override.d"
readonly RSPAMD_DMS_CUSTOM_COMMANDS_F="${RSPAMD_DMS_D}/custom-commands.conf"
readonly RSPAMD_DMS_CUSTOM_COMMANDS_F="${RSPAMD_DMS_D}/custom-commands.conf"
fi
}
# Parses `RSPAMD_DMS_CUSTOM_COMMANDS_F` and executed the directives given by the file.

View File

@ -17,9 +17,44 @@ function _escape_for_sed() {
# Returns input after filtering out lines that are:
# empty, white-space, comments (`#` as the first non-whitespace character)
function _get_valid_lines_from_file() {
_convert_crlf_to_lf_if_necessary "${1}"
_append_final_newline_if_missing "${1}"
grep --extended-regexp --invert-match "^\s*$|^\s*#" "${1}" || true
}
# This is to sanitize configs from users that unknowingly introduced CRLF:
function _convert_crlf_to_lf_if_necessary() {
if [[ $(file "${1}") =~ 'CRLF' ]]; then
_log 'warn' "File '${1}' contains CRLF line-endings"
if [[ -w ${1} ]]; then
_log 'debug' 'Converting CRLF to LF'
sed -i 's|\r||g' "${1}"
else
_log 'warn' "File '${1}' is not writable - cannot change CRLF to LF"
fi
fi
}
# This is to sanitize configs from users that unknowingly removed the end-of-file LF:
function _append_final_newline_if_missing() {
# Correctly detect a missing final newline and fix it:
# https://stackoverflow.com/questions/38746/how-to-detect-file-ends-in-newline#comment82380232_25749716
# https://unix.stackexchange.com/questions/31947/how-to-add-a-newline-to-the-end-of-a-file/441200#441200
# https://unix.stackexchange.com/questions/159557/how-to-non-invasively-test-for-write-access-to-a-file
if [[ $(tail -c1 "${1}" | wc -l) -eq 0 ]]; then
# Avoid fixing when the destination is read-only:
if [[ -w ${1} ]]; then
printf '\n' >> "${1}"
_log 'info' "File '${1}' was missing a final newline - this has been fixed"
else
_log 'warn' "File '${1}' is missing a final newline - it is not writable, hence it was not fixed - the last line will not be processed!"
fi
fi
}
# Provide the name of an environment variable to this function
# and it will return its value stored in /etc/dms-settings
function _get_dms_env_value() {

View File

@ -95,8 +95,9 @@ function _setup_apply_fixes_after_configuration() {
_log 'debug' 'Removing files and directories from older versions'
rm -rf /var/mail-state/spool-postfix/{dev,etc,lib,pid,usr,private/auth}
_rspamd_get_envs
# /tmp/docker-mailserver/rspamd/dkim
_log 'debug' "Ensuring ${RSPAMD_DMS_DKIM_D} is owned by '_rspamd:_rspamd'"
_log 'debug' "Ensuring '${RSPAMD_DMS_DKIM_D}' is owned by '_rspamd:_rspamd'"
chown -R _rspamd:_rspamd "${RSPAMD_DMS_DKIM_D}"
}

View File

@ -109,8 +109,9 @@ function _setup_postfix_late() {
function __postfix__setup_override_configuration() {
__postfix__log 'debug' 'Overriding / adjusting configuration with user-supplied values'
if [[ -f /tmp/docker-mailserver/postfix-main.cf ]]; then
cat /tmp/docker-mailserver/postfix-main.cf >>/etc/postfix/main.cf
local OVERRIDE_CONFIG_POSTFIX_MAIN='/tmp/docker-mailserver/postfix-main.cf'
if [[ -f ${OVERRIDE_CONFIG_POSTFIX_MAIN} ]]; then
cat "${OVERRIDE_CONFIG_POSTFIX_MAIN}" >>/etc/postfix/main.cf
_adjust_mtime_for_postfix_maincf
# do not directly output to 'main.cf' as this causes a read-write-conflict
@ -118,20 +119,19 @@ function __postfix__setup_override_configuration() {
mv /tmp/postfix-main-new.cf /etc/postfix/main.cf
_adjust_mtime_for_postfix_maincf
__postfix__log 'trace' "Adjusted '/etc/postfix/main.cf' according to '/tmp/docker-mailserver/postfix-main.cf'"
__postfix__log 'trace' "Adjusted '/etc/postfix/main.cf' according to '${OVERRIDE_CONFIG_POSTFIX_MAIN}'"
else
__postfix__log 'trace' "No extra Postfix settings loaded because optional '/tmp/docker-mailserver/postfix-main.cf' was not provided"
__postfix__log 'trace' "No extra Postfix settings loaded because optional '${OVERRIDE_CONFIG_POSTFIX_MAIN}' was not provided"
fi
if [[ -f /tmp/docker-mailserver/postfix-master.cf ]]; then
local OVERRIDE_CONFIG_POSTFIX_MASTER='/tmp/docker-mailserver/postfix-master.cf'
if [[ -f ${OVERRIDE_CONFIG_POSTFIX_MASTER} ]]; then
while read -r LINE; do
if [[ ${LINE} =~ ^[0-9a-z] ]]; then
postconf -P "${LINE}"
fi
done < /tmp/docker-mailserver/postfix-master.cf
__postfix__log 'trace' "Adjusted '/etc/postfix/master.cf' according to '/tmp/docker-mailserver/postfix-master.cf'"
[[ ${LINE} =~ ^[0-9a-z] ]] && postconf -P "${LINE}"
done < <(_get_valid_lines_from_file "${OVERRIDE_CONFIG_POSTFIX_MASTER}")
__postfix__log 'trace' "Adjusted '/etc/postfix/master.cf' according to '${OVERRIDE_CONFIG_POSTFIX_MASTER}'"
else
__postfix__log 'trace' "No extra Postfix settings loaded because optional '/tmp/docker-mailserver/postfix-master.cf' was not provided"
__postfix__log 'trace' "No extra Postfix settings loaded because optional '${OVERRIDE_CONFIG_POSTFIX_MASTER}' was not provided"
fi
}

View File

@ -102,7 +102,6 @@ function _init_with_defaults() {
# The config volume cannot be read-only as some data needs to be written at container startup
#
# - two sed failures (unknown lines)
# - dovecot-quotas.cf (setup-stack.sh:_setup_dovecot_quotas)
# - postfix-aliases.cf (setup-stack.sh:_setup_postfix_aliases)
# TODO: Check how many tests need write access. Consider using `docker create` + `docker cp` for easier cleanup.

View File

@ -70,3 +70,45 @@ SOURCE_BASE_PATH="${REPOSITORY_ROOT:?Expected REPOSITORY_ROOT to be set}/target/
assert_failure
assert_output --partial "ENV var name must be provided to _env_var_expect_integer"
}
@test '(utils.sh) _convert_crlf_to_lf_if_necessary' {
# shellcheck source=../../../../../target/scripts/helpers/log.sh
source "${SOURCE_BASE_PATH}/log.sh"
# shellcheck source=../../../../../target/scripts/helpers/utils.sh
source "${SOURCE_BASE_PATH}/utils.sh"
# Create a temporary file in the BATS test-case folder:
local TMP_DMS_CONFIG=$(mktemp -p "${BATS_TEST_TMPDIR}" -t 'dms_XXX.cf')
# A file with mixed line-endings including CRLF:
echo -en 'line one\nline two\r\n' > "${TMP_DMS_CONFIG}"
# Confirm CRLF detected:
run file "${TMP_DMS_CONFIG}"
assert_output --partial 'CRLF'
# Helper method detects and fixes:
_convert_crlf_to_lf_if_necessary "${TMP_DMS_CONFIG}"
run file "${TMP_DMS_CONFIG}"
refute_output --partial 'CRLF'
}
@test '(utils.sh) _append_final_newline_if_missing' {
# shellcheck source=../../../../../target/scripts/helpers/log.sh
source "${SOURCE_BASE_PATH}/log.sh"
# shellcheck source=../../../../../target/scripts/helpers/utils.sh
source "${SOURCE_BASE_PATH}/utils.sh"
# Create a temporary file in the BATS test-case folder:
local TMP_DMS_CONFIG=$(mktemp -p "${BATS_TEST_TMPDIR}" -t 'dms_XXX.cf')
# A file missing a final newline:
echo -en 'line one\nline two' > "${TMP_DMS_CONFIG}"
# Confirm missing newline:
run bash -c "tail -c 1 '${TMP_DMS_CONFIG}' | wc -l"
assert_output '0'
# Helper method detects and fixes:
_append_final_newline_if_missing "${TMP_DMS_CONFIG}"
run bash -c "tail -c 1 '${TMP_DMS_CONFIG}' | wc -l"
assert_output '1'
}