diff options
author | Sandro <sandro.jaeckel@gmail.com> | 2024-05-23 13:54:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-23 13:54:39 +0200 |
commit | 360221d4bf8af6bf74c00a4e07fffbf8479de7dd (patch) | |
tree | 765f11c274e3dcb16d73683698223a754bbc6e05 /nixos | |
parent | 56141e2236e2607f3e54858a9617b2eb8b4adee8 (diff) | |
parent | 2c4128ea01c48cdd3e0adce10aaffd7c44495ea7 (diff) |
Merge pull request #313096 from onny/stalwart-fix-test
Diffstat (limited to 'nixos')
-rw-r--r-- | nixos/modules/services/mail/stalwart-mail.nix | 4 | ||||
-rw-r--r-- | nixos/tests/stalwart-mail.nix | 241 |
2 files changed, 136 insertions, 109 deletions
diff --git a/nixos/modules/services/mail/stalwart-mail.nix b/nixos/modules/services/mail/stalwart-mail.nix index c69a2ca400bae..06b48c86907c5 100644 --- a/nixos/modules/services/mail/stalwart-mail.nix +++ b/nixos/modules/services/mail/stalwart-mail.nix @@ -70,7 +70,9 @@ in { storage.lookup = mkDefault "db"; storage.blob = mkDefault "blob"; resolver.type = mkDefault "system"; - resolver.public-suffix = mkDefault ["https://publicsuffix.org/list/public_suffix_list.dat"]; + resolver.public-suffix = lib.mkDefault [ + "file://${pkgs.publicsuffix-list}/share/publicsuffix/public_suffix_list.dat" + ]; }; systemd.services.stalwart-mail = { diff --git a/nixos/tests/stalwart-mail.nix b/nixos/tests/stalwart-mail.nix index 581090cd70f48..4075b32e2c1f7 100644 --- a/nixos/tests/stalwart-mail.nix +++ b/nixos/tests/stalwart-mail.nix @@ -1,122 +1,147 @@ # Rudimentary test checking that the Stalwart email server can: # - receive some message through SMTP submission, then # - serve this message through IMAP. +{ + system ? builtins.currentSystem, + config ? { }, + pkgs ? import ../../.. { inherit system config; }, + lib ? pkgs.lib, +}: let certs = import ./common/acme/server/snakeoil-certs.nix; domain = certs.domain; - -in import ./make-test-python.nix ({ lib, ... }: { - name = "stalwart-mail"; - - nodes.main = { pkgs, ... }: { - security.pki.certificateFiles = [ certs.ca.cert ]; - - services.stalwart-mail = { - enable = true; - settings = { - server.hostname = domain; - - certificate."snakeoil" = { - cert = "file://${certs.${domain}.cert}"; - private-key = "file://${certs.${domain}.key}"; - }; - - server.tls = { - certificate = "snakeoil"; + makeTest = import ./make-test-python.nix; + mkTestName = + pkg: "${pkg.pname}_${pkg.version}"; + stalwartPackages = { + inherit (pkgs) stalwart-mail_0_6 stalwart-mail; + }; + stalwartAtLeast = lib.versionAtLeast; + makeStalwartTest = + { + package, + name ? mkTestName package, + }: + makeTest { + inherit name; + meta.maintainers = with lib.maintainers; [ + happysalada pacien onny + ]; + + nodes.machine = { lib, ... }: { + + security.pki.certificateFiles = [ certs.ca.cert ]; + + services.stalwart-mail = { enable = true; - implicit = false; - }; - - server.listener = { - "smtp-submission" = { - bind = [ "[::]:587" ]; - protocol = "smtp"; - }; - - "imap" = { - bind = [ "[::]:143" ]; - protocol = "imap"; + inherit package; + settings = { + server.hostname = domain; + + # TODO: Remove backwards compatibility as soon as we drop legacy version 0.6.0 + certificate."snakeoil" = let + certPath = if stalwartAtLeast package.version "0.7.0" then "%{file://${certs.${domain}.cert}}%" else "file://${certs.${domain}.cert}"; + keyPath = if stalwartAtLeast package.version "0.7.0" then "%{file:${certs.${domain}.key}}%" else "file://${certs.${domain}.key}"; + in { + cert = certPath; + private-key = keyPath; + }; + + server.tls = { + certificate = "snakeoil"; + enable = true; + implicit = false; + }; + + server.listener = { + "smtp-submission" = { + bind = [ "[::]:587" ]; + protocol = "smtp"; + }; + + "imap" = { + bind = [ "[::]:143" ]; + protocol = "imap"; + }; + }; + + session.auth.mechanisms = "[plain]"; + session.auth.directory = "'in-memory'"; + storage.directory = "in-memory"; + + session.rcpt.directory = "'in-memory'"; + queue.outbound.next-hop = "'local'"; + + directory."in-memory" = { + type = "memory"; + # TODO: Remove backwards compatibility as soon as we drop legacy version 0.6.0 + principals = let + condition = if stalwartAtLeast package.version "0.7.0" then "class" else "type"; + in builtins.map (p: p // { ${condition} = "individual"; }) [ + { + name = "alice"; + secret = "foobar"; + email = [ "alice@${domain}" ]; + } + { + name = "bob"; + secret = "foobar"; + email = [ "bob@${domain}" ]; + } + ]; + }; }; }; - resolver.public-suffix = [ ]; # do not fetch from web in sandbox - - session.auth.mechanisms = "[plain]"; - session.auth.directory = "'in-memory'"; - storage.directory = "in-memory"; - - session.rcpt.directory = "'in-memory'"; - queue.outbound.next-hop = "'local'"; - - directory."in-memory" = { - type = "memory"; - principals = [ - { - type = "individual"; - name = "alice"; - secret = "foobar"; - email = [ "alice@${domain}" ]; - } - { - type = "individual"; - name = "bob"; - secret = "foobar"; - email = [ "bob@${domain}" ]; - } - ]; - }; - }; - }; + environment.systemPackages = [ + (pkgs.writers.writePython3Bin "test-smtp-submission" { } '' + from smtplib import SMTP + + with SMTP('localhost', 587) as smtp: + smtp.starttls() + smtp.login('alice', 'foobar') + smtp.sendmail( + 'alice@${domain}', + 'bob@${domain}', + """ + From: alice@${domain} + To: bob@${domain} + Subject: Some test message + + This is a test message. + """.strip() + ) + '') + + (pkgs.writers.writePython3Bin "test-imap-read" { } '' + from imaplib import IMAP4 + + with IMAP4('localhost') as imap: + imap.starttls() + status, [caps] = imap.login('bob', 'foobar') + assert status == 'OK' + imap.select() + status, [ref] = imap.search(None, 'ALL') + assert status == 'OK' + [msgId] = ref.split() + status, msg = imap.fetch(msgId, 'BODY[TEXT]') + assert status == 'OK' + assert msg[0][1].strip() == b'This is a test message.' + '') + ]; - environment.systemPackages = [ - (pkgs.writers.writePython3Bin "test-smtp-submission" { } '' - from smtplib import SMTP - - with SMTP('localhost', 587) as smtp: - smtp.starttls() - smtp.login('alice', 'foobar') - smtp.sendmail( - 'alice@${domain}', - 'bob@${domain}', - """ - From: alice@${domain} - To: bob@${domain} - Subject: Some test message - - This is a test message. - """.strip() - ) - '') - - (pkgs.writers.writePython3Bin "test-imap-read" { } '' - from imaplib import IMAP4 - - with IMAP4('localhost') as imap: - imap.starttls() - status, [caps] = imap.login('bob', 'foobar') - assert status == 'OK' - imap.select() - status, [ref] = imap.search(None, 'ALL') - assert status == 'OK' - [msgId] = ref.split() - status, msg = imap.fetch(msgId, 'BODY[TEXT]') - assert status == 'OK' - assert msg[0][1].strip() == b'This is a test message.' - '') - ]; - }; - - testScript = /* python */ '' - main.wait_for_unit("stalwart-mail.service") - main.wait_for_open_port(587) - main.wait_for_open_port(143) + }; - main.succeed("test-smtp-submission") - main.succeed("test-imap-read") - ''; + testScript = '' + start_all() + machine.wait_for_unit("stalwart-mail.service") + machine.wait_for_open_port(587) + machine.wait_for_open_port(143) - meta = { - maintainers = with lib.maintainers; [ happysalada pacien ]; - }; -}) + machine.succeed("test-smtp-submission") + machine.succeed("test-imap-read") + ''; + }; +in +lib.mapAttrs (_: package: makeStalwartTest { inherit package; }) stalwartPackages |