From 82d1dc4549f3ba079505b6ebaa266e6d04d1cce4 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Fri, 2 Oct 2026 00:27:50 +0200 Subject: tests/email/*: Rename to stalwart email tests These tests explicitly test our stalwart email module. --- tests/by-name/em/email-dns/nodes/mail_server.nix | 52 ---- tests/by-name/em/email-dns/nodes/name_server.nix | 292 ---------------------- tests/by-name/em/email-dns/nodes/user.nix | 70 ------ tests/by-name/em/email-dns/test.nix | 170 ------------- tests/by-name/em/email-http/nodes/mail_server.nix | 57 ----- tests/by-name/em/email-http/nodes/user.nix | 26 -- tests/by-name/em/email-http/test.nix | 103 -------- tests/by-name/em/email-ip/test.nix | 177 ------------- 8 files changed, 947 deletions(-) delete mode 100644 tests/by-name/em/email-dns/nodes/mail_server.nix delete mode 100644 tests/by-name/em/email-dns/nodes/name_server.nix delete mode 100644 tests/by-name/em/email-dns/nodes/user.nix delete mode 100644 tests/by-name/em/email-dns/test.nix delete mode 100644 tests/by-name/em/email-http/nodes/mail_server.nix delete mode 100644 tests/by-name/em/email-http/nodes/user.nix delete mode 100644 tests/by-name/em/email-http/test.nix delete mode 100644 tests/by-name/em/email-ip/test.nix (limited to 'tests/by-name/em') diff --git a/tests/by-name/em/email-dns/nodes/mail_server.nix b/tests/by-name/em/email-dns/nodes/mail_server.nix deleted file mode 100644 index 279d289..0000000 --- a/tests/by-name/em/email-dns/nodes/mail_server.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ - extraModules, - pkgs, - vhackPackages, -}: { - mkMailServer = serverName: principal: { - config, - lib, - nodes, - ... - }: { - imports = - extraModules - ++ [ - ../../../../../modules - ../../../../common/acme/client.nix - ../../../../common/dns/client.nix - ]; - - environment.systemPackages = [ - pkgs.bind - pkgs.openssl - ]; - - age.identityPaths = ["${../../../../common/email/hostKey}"]; - - vhack = { - stalwart-mail = { - enable = true; - fqdn = "${serverName}.server.com"; - admin = "admin@${serverName}.server.com"; - security = { - dkimKeys = let - loadKey = name: { - dkimPublicKey = builtins.readFile (../../../../common/email/dkim + "/${name}/public"); - dkimPrivateKeyPath = ../../../../common/email/dkim + "/${name}/private.age"; - keyAlgorithm = "ed25519-sha256"; - }; - in { - "mail1.server.com" = loadKey "mail1.server.com"; - "mail2.server.com" = loadKey "mail2.server.com"; - "alice.com" = loadKey "alice.com"; - "bob.com" = loadKey "bob.com"; - }; - verificationMode = "strict"; - }; - openFirewall = true; - principals = [principal]; - }; - }; - }; -} diff --git a/tests/by-name/em/email-dns/nodes/name_server.nix b/tests/by-name/em/email-dns/nodes/name_server.nix deleted file mode 100644 index bde1a16..0000000 --- a/tests/by-name/em/email-dns/nodes/name_server.nix +++ /dev/null @@ -1,292 +0,0 @@ -{extraModules}: { - config, - lib, - nodes, - pkgs, - ... -}: let - keyAlgoToKeyType = keyAlgo: - if keyAlgo == "ed25519-sha256" - then "ed25519" - else if keyAlgo == "rsa-sha-256" || keyAlgo == "rsa-sha-1" - then "rsa" - else builtins.throw "Impossible"; - - mkZone = user: nodes: lib: cfg: { - SOA = { - nameServer = "ns.server.com"; - adminEmail = "${user}@${user}.com"; - serial = 2024012301; - }; - - MX = [ - { - preference = 10; - exchange = "${cfg.fqdn}."; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc8461.html#section-3.1 - # Also see the policy in the hmtl part. - MTA-STS = [ - { - id = "20250228Z"; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc7208.html - # https://en.wikipedia.org/wiki/Sender_Policy_Framework - TXT = [ - (builtins.concatStringsSep " " - [ - "v=spf1" # The version. - "+mx" # Allow mail from this domain MX record. - "-all" # Reject all other emails if the previous mechanism did not match. - ]) - ]; - - # https://www.rfc-editor.org/rfc/rfc6376.html#section-3.6.1 - # https://www.rfc-editor.org/rfc/rfc6376.html#section-7.5 - DKIM = [ - { - selector = "mail"; - k = keyAlgoToKeyType cfg.security.dkimKeys."${user}.com".keyAlgorithm; - p = cfg.security.dkimKeys."${user}.com".dkimPublicKey; - s = ["email"]; - t = ["s"]; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc7489.html#section-6.3 - DMARC = [ - { - adkim = "strict"; - aspf = "strict"; - fo = ["0" "1" "d" "s"]; - p = "reject"; - rua = cfg.admin; - ruf = [cfg.admin]; - } - ]; - - A = [ - nodes.${user}.networking.primaryIPAddress - ]; - AAAA = [ - nodes.${user}.networking.primaryIPv6Address - ]; - }; - mkServerZone = serverName: nodes: lib: let - cfg = nodes."${serverName}_server".vhack.stalwart-mail; - in { - SOA = { - nameServer = "ns.server.com"; - adminEmail = "admin@server.com"; - serial = 2024012301; - }; - MX = [ - { - preference = 10; - exchange = "${serverName}.server.com."; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc6376.html#section-3.6.1 - # https://www.rfc-editor.org/rfc/rfc6376.html#section-7.5 - DKIM = [ - { - selector = "mail"; - k = keyAlgoToKeyType cfg.security.dkimKeys."${serverName}.server.com".keyAlgorithm; - p = cfg.security.dkimKeys."${serverName}.server.com".dkimPublicKey; - s = ["email"]; - t = ["s"]; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc7489.html#section-6.3 - DMARC = [ - { - adkim = "strict"; - aspf = "strict"; - fo = ["0" "1" "d" "s"]; - p = "quarantine"; - rua = cfg.admin; - ruf = [cfg.admin]; - } - ]; - - # https://www.rfc-editor.org/rfc/rfc7208.html - # NOTE(@bpeetz): This server might not be directly sending mail, but it is still required for - # the SMTP EHLO check. <2025-02-25> - TXT = [ - (builtins.concatStringsSep " " - [ - "v=spf1" # The version. - "+mx" # Allow mail from this domain MX record. - "-all" # Reject all other emails if the previous mechanism did not match. - ]) - ]; - - A = [ - nodes."${serverName}_server".networking.primaryIPAddress - ]; - AAAA = [ - nodes."${serverName}_server".networking.primaryIPv6Address - ]; - }; -in { - imports = - extraModules - ++ [ - ../../../../../modules - ../../../../common/acme/client.nix - ../../../../common/dns/server.nix - ]; - - services.nginx = { - logError = "stderr debug"; - virtualHosts = let - mkStsHost = mx: { - forceSSL = true; - enableACME = true; - root = pkgs.runCommandLocal "mkPolicy" {} '' - mkdir --parents $out/.well-known/ - - # https://www.rfc-editor.org/rfc/rfc8461.html#section-3.2 - cat << EOF > $out/.well-known/mta-sts.txt - version: STSv1 - mode: enforce - mx: ${mx} - max_age: 604800 - EOF - ''; - }; - in { - "mta-sts.alice.com" = mkStsHost "mail2.server.com"; - "mta-sts.bob.com" = mkStsHost "mail1.server.com"; - }; - }; - - vhack = { - nginx = { - enable = true; - }; - dns.zones = let - stsZone = { - SOA = { - nameServer = "ns"; - adminEmail = "admin@server.com"; - serial = 2025012301; - }; - - useOrigin = false; - - A = [ - nodes.name_server.networking.primaryIPAddress - ]; - AAAA = [ - nodes.name_server.networking.primaryIPv6Address - ]; - }; - in { - "arpa" = { - SOA = { - nameServer = "ns"; - adminEmail = "admin@server.com"; - serial = 2025012301; - }; - useOrigin = false; - - PTR = [ - { - name = "acme.test"; - ip.v4 = nodes.acme.networking.primaryIPAddress; - } - { - name = "acme.test"; - ip.v6 = nodes.acme.networking.primaryIPv6Address; - } - - { - name = "alice.com"; - ip.v4 = nodes.alice.networking.primaryIPAddress; - } - { - name = "alice.com"; - ip.v6 = nodes.alice.networking.primaryIPv6Address; - } - - { - name = "bob"; - ip.v4 = nodes.bob.networking.primaryIPAddress; - } - { - name = "bob"; - ip.v6 = nodes.bob.networking.primaryIPv6Address; - } - - { - name = "mail1.server.com"; - ip.v4 = nodes.mail1_server.networking.primaryIPAddress; - } - { - name = "mail1.server.com"; - ip.v6 = nodes.mail1_server.networking.primaryIPv6Address; - } - - { - name = "mail2.server.com"; - ip.v4 = nodes.mail2_server.networking.primaryIPAddress; - } - { - name = "mail2.server.com"; - ip.v6 = nodes.mail2_server.networking.primaryIPv6Address; - } - - { - name = "ns.server.com"; - ip.v4 = nodes.name_server.networking.primaryIPAddress; - } - { - name = "ns.server.com"; - ip.v6 = nodes.name_server.networking.primaryIPv6Address; - } - ]; - }; - - "alice.com" = mkZone "alice" nodes lib nodes.mail2_server.vhack.stalwart-mail; - "mta-sts.alice.com" = stsZone; - "bob.com" = mkZone "bob" nodes lib nodes.mail1_server.vhack.stalwart-mail; - "mta-sts.bob.com" = stsZone; - "mail1.server.com" = mkServerZone "mail1" nodes lib; - "mail2.server.com" = mkServerZone "mail2" nodes lib; - "ns.server.com" = { - SOA = { - nameServer = "ns"; - adminEmail = "admin@server.com"; - serial = 2025012301; - }; - useOrigin = false; - - A = [ - nodes.name_server.networking.primaryIPAddress - ]; - AAAA = [ - nodes.name_server.networking.primaryIPv6Address - ]; - }; - "server.com" = { - SOA = { - nameServer = "ns"; - adminEmail = "admin@server.com"; - serial = 2025012301; - }; - - useOrigin = false; - NS = [ - "ns.server.com." - ]; - }; - }; - }; -} diff --git a/tests/by-name/em/email-dns/nodes/user.nix b/tests/by-name/em/email-dns/nodes/user.nix deleted file mode 100644 index fba02ce..0000000 --- a/tests/by-name/em/email-dns/nodes/user.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ - pkgs, - vhackPackages, -}: { - mkUser = user: serverName: { - nodes, - lib, - ... - }: { - imports = [ - ../../../../common/acme/client.nix - ../../../../common/dns/client.nix - ]; - - environment.systemPackages = [ - vhackPackages.fetchmail-common-name - pkgs.msmtp - pkgs.procmail - - pkgs.bind - pkgs.openssl - ]; - - users.users."${user}" = {isNormalUser = true;}; - - systemd.tmpfiles.rules = [ - "d /home/${user}/mail 0700 ${user} users - -" - "L /home/${user}/.fetchmailrc - - - - /etc/homeSetup/.fetchmailrc" - "L /home/${user}/.procmailrc - - - - /etc/homeSetup/.procmailrc" - "L /home/${user}/.msmtprc - - - - /etc/homeSetup/.msmtprc" - ]; - - environment.etc = { - "homeSetup/.fetchmailrc" = { - text = '' - poll "${serverName}.server.com" protocol IMAP - username "${user}" - password "${user}-password" - ssl - mda procmail; - ''; - mode = "0600"; - inherit user; - }; - "homeSetup/.procmailrc" = { - text = '' - DEFAULT=$HOME/mail - ''; - mode = "0600"; - inherit user; - }; - "homeSetup/.msmtprc" = { - text = '' - account ${user} - host ${serverName}.server.com - domain ${user}.com - port 465 - from ${user}@${user}.com - user ${user} - password ${user}-password - auth on - tls on - tls_starttls off - ''; - mode = "0600"; - inherit user; - }; - }; - }; -} diff --git a/tests/by-name/em/email-dns/test.nix b/tests/by-name/em/email-dns/test.nix deleted file mode 100644 index 33955d8..0000000 --- a/tests/by-name/em/email-dns/test.nix +++ /dev/null @@ -1,170 +0,0 @@ -{ - nixos-lib, - pkgsUnstable, - nixpkgs-unstable, - vhackPackages, - pkgs, - extraModules, - nixLib, - ... -}: let - mail_server = import ./nodes/mail_server.nix {inherit extraModules pkgs vhackPackages;}; - inherit (mail_server) mkMailServer; - user = import ./nodes/user.nix {inherit pkgs vhackPackages;}; - inherit (user) mkUser; -in - nixos-lib.runTest { - # Wait until we actually use stalwart again - meta.broken = true; - - hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs - - name = "email-dns"; - - node = { - specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;}; - - # Use the nixpkgs as constructed by the `nixpkgs.*` options - pkgs = null; - }; - - nodes = { - acme = { - nodes, - lib, - ... - }: { - imports = [ - ../../../common/acme/server.nix - ../../../common/dns/client.nix - ]; - }; - - name_server = import ./nodes/name_server.nix {inherit extraModules;}; - - mail1_server = - mkMailServer "mail1" - { - class = "individual"; - name = "bob"; - secret = "{PLAIN}bob-password"; - email = ["bob@bob.com"]; - }; - - mail2_server = - mkMailServer "mail2" - { - class = "individual"; - name = "alice"; - secret = "{PLAIN}alice-password"; - email = ["alice@alice.com"]; - }; - - bob = mkUser "bob" "mail1"; - alice = mkUser "alice" "mail2"; - }; - - testScript = {...}: let - checkEmailEmpty = pkgs.writeShellScript "assert-empty-emails" '' - set -xe - - # fetchmail returns EXIT_CODE 1 when no new mail - fetchmail --verbose >&2 || [ "$?" -eq 1 ] || { - echo "Mail was not empty" >&2 - exit 1 - } - ''; - checkEmailNotEmpty = pkgs.writeShellScript "assert-empty-emails" '' - set -xe - - # fetchmail returns EXIT_CODE 1 when no new mail - fetchmail --verbose >&2 || [ "$?" -ne 1 ] || { - echo "No new mail" >&2 - exit 1 - } - ''; - checkSpamEmailNotEmpty = pkgs.writeShellScript "assert-empty-emails" '' - set -xe - - # fetchmail returns EXIT_CODE 1 when no new mail - fetchmail --folder JUNK --verbose >&2 || [ "$?" -ne 1 ] || { - echo "No new mail" >&2 - exit 1 - } - ''; - - acme = import ../../../common/acme {inherit pkgs;}; - in - acme.prepare ["mail1_server" "mail2_server" "alice" "bob"] - # Python - '' - from time import sleep - - mail1_server.wait_for_unit("stalwart-mail.service") - mail1_server.wait_for_open_port(993) # imap - mail1_server.wait_for_open_port(465) # smtp - mail2_server.wait_for_unit("stalwart-mail.service") - mail2_server.wait_for_open_port(993) # imap - mail2_server.wait_for_open_port(465) # smtp - - alice.wait_for_unit("multi-user.target") - bob.wait_for_unit("multi-user.target") - - name_server.wait_until_succeeds("stat /var/lib/acme/mta-sts.alice.com/cert.pem") - name_server.wait_until_succeeds("stat /var/lib/acme/mta-sts.bob.com/cert.pem") - - with subtest("Both mailserver successfully started all services"): - import json - def all_services_running(host): - (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json") - host_failed = json.loads(output) - assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}" - all_services_running(mail1_server) - all_services_running(mail2_server) - - with subtest("Both start without mail"): - alice.succeed("sudo -u alice ${checkEmailEmpty}") - bob.succeed("sudo -u bob ${checkEmailEmpty}") - - with subtest("Alice can send an empty email to bob"): - alice.succeed("sudo -u alice ${pkgs.writeShellScript "alice-send" '' - set -xe - - echo "" | msmtp --debug --account alice bob@bob.com >&2 - ''}") - - # Give `mail2_server` some time to send the email. - sleep(160) - - bob.succeed("sudo -u bob ${checkSpamEmailNotEmpty}") - - with subtest("Alice can send an non-empty email to bob"): - alice.succeed("sudo -u alice ${pkgs.writeShellScript "alice-send" '' - set -xe - - cat << EOF | msmtp --debug --account alice bob@bob.com >&2 - Subject: Hi bob, I'm Alice! - - Good day, Bob! - - This is an email. - It contains a subject and a body. - I also assert utf8 support by including my last name in this very message. - - XOXO - Alice van DÃ¥ligen. - - . - EOF - ''}") - - # Give `mail2_server` some time to send the email. - sleep(120) - - bob.succeed("sudo -u bob ${checkEmailNotEmpty}") - - mail1_server.copy_from_vm("/var/lib/", "server1") - mail2_server.copy_from_vm("/var/lib/", "server2") - bob.copy_from_vm("/home/bob/mail", "bob") - ''; - } diff --git a/tests/by-name/em/email-http/nodes/mail_server.nix b/tests/by-name/em/email-http/nodes/mail_server.nix deleted file mode 100644 index e94c4e9..0000000 --- a/tests/by-name/em/email-http/nodes/mail_server.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - extraModules, - pkgs, - vhackPackages, -}: { - mkMailServer = serverName: principal: { - config, - lib, - nodes, - ... - }: { - imports = - extraModules - ++ [ - ../../../../../modules - ../../../../common/acme/client.nix - ]; - - environment.systemPackages = [ - pkgs.bind - pkgs.openssl - ]; - - networking.nameservers = lib.mkForce [ - nodes.name_server.networking.primaryIPAddress - nodes.name_server.networking.primaryIPv6Address - ]; - - age.identityPaths = ["${../../../../common/email/hostKey}"]; - - vhack = { - stalwart-mail = { - enable = true; - fqdn = "${serverName}.server.com"; - admin = "admin@${serverName}.server.com"; - security = { - dkimKeys = let - loadKey = name: { - dkimPublicKey = builtins.readFile (../../../../common/email/dkim + "/${name}/public"); - dkimPrivateKeyPath = ../../../../common/email/dkim + "/${name}/private.age"; - keyAlgorithm = "ed25519-sha256"; - }; - in { - "mail.server.com" = loadKey "mail1.server.com"; - "bob.com" = loadKey "bob.com"; - }; - verificationMode = "strict"; - }; - openFirewall = true; - principals = - if principal == null - then null - else [principal]; - }; - }; - }; -} diff --git a/tests/by-name/em/email-http/nodes/user.nix b/tests/by-name/em/email-http/nodes/user.nix deleted file mode 100644 index 73b9ff7..0000000 --- a/tests/by-name/em/email-http/nodes/user.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - pkgs, - vhackPackages, -}: { - mkUser = user: serverName: { - nodes, - lib, - ... - }: { - imports = [ - ../../../../common/acme/client.nix - ]; - - environment.systemPackages = [ - pkgs.bind - pkgs.openssl - ]; - - networking.nameservers = lib.mkForce [ - nodes.name_server.networking.primaryIPAddress - nodes.name_server.networking.primaryIPv6Address - ]; - - users.users."${user}" = {isNormalUser = true;}; - }; -} diff --git a/tests/by-name/em/email-http/test.nix b/tests/by-name/em/email-http/test.nix deleted file mode 100644 index 42fd22b..0000000 --- a/tests/by-name/em/email-http/test.nix +++ /dev/null @@ -1,103 +0,0 @@ -{ - nixos-lib, - pkgsUnstable, - nixpkgs-unstable, - vhackPackages, - pkgs, - extraModules, - nixLib, - ... -}: let - mail_server = import ./nodes/mail_server.nix {inherit extraModules pkgs vhackPackages;}; - inherit (mail_server) mkMailServer; - user = import ./nodes/user.nix {inherit pkgs vhackPackages;}; - inherit (user) mkUser; -in - nixos-lib.runTest { - # Wait until we actually use stalwart again - meta.broken = true; - - hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs - - name = "email-http"; - - node = { - specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;}; - - # Use the nixpkgs as constructed by the `nixpkgs.*` options - pkgs = null; - }; - - nodes = { - acme = { - nodes, - lib, - ... - }: { - imports = [ - ../../../common/acme/server.nix - ../../../common/dns/client.nix - ]; - }; - - name_server = {nodes, ...}: { - imports = - extraModules - ++ [ - ../../../common/acme/client.nix - ../../../common/dns/server.nix - ]; - - vhack.dns.zones = { - "mail.server.com" = { - SOA = { - nameServer = "ns"; - adminEmail = "admin@server.com"; - serial = 2025012301; - }; - useOrigin = false; - - A = [ - nodes.mail_server.networking.primaryIPAddress - ]; - AAAA = [ - nodes.mail_server.networking.primaryIPv6Address - ]; - }; - }; - }; - - mail_server = mkMailServer "mail" null; - - bob = mkUser "bob" "mail"; - }; - - # TODO(@bpeetz): This test should also test the http JMAP features of stalwart-mail. <2025-04-12> - testScript = _: let - acme = import ../../../common/acme {inherit pkgs;}; - in - acme.prepare ["mail_server" "bob"] - # Python - '' - mail_server.wait_for_unit("stalwart-mail.service") - mail_server.wait_for_open_port(993) # imap - mail_server.wait_for_open_port(465) # smtp - - bob.wait_for_unit("multi-user.target") - - with subtest("The mailserver successfully started all services"): - import json - def all_services_running(host): - (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json") - host_failed = json.loads(output) - assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}" - all_services_running(mail_server) - - with subtest("Bob can use the self-service interface"): - bob.succeed("${pkgs.writeShellScript "check-self-service" '' - curl mail.server.com --location --output /home/bob/output.html; - ''}") - - bob.copy_from_vm("/home/bob", "") - ''; - } diff --git a/tests/by-name/em/email-ip/test.nix b/tests/by-name/em/email-ip/test.nix deleted file mode 100644 index c0b2d7e..0000000 --- a/tests/by-name/em/email-ip/test.nix +++ /dev/null @@ -1,177 +0,0 @@ -{ - nixos-lib, - pkgsUnstable, - nixpkgs-unstable, - vhackPackages, - pkgs, - extraModules, - nixLib, - ... -}: let - domain = "mail.server.test"; - - scripts = { - checkEmailEmpty = pkgs.writeShellScript "assert-empty-emails" '' - set -xe - - # fetchmail returns EXIT_CODE 1 when no new mail - fetchmail --nosslcertck --verbose >&2 || [ "$?" -eq 1 ] || { - echo "Expected exit code 1." >&2 - exit 1 - } - ''; - }; - - mkUser = user: {nodes, ...}: let - domainIp = nodes.server.networking.primaryIPAddress; - in { - environment.systemPackages = with pkgs; [ - fetchmail - msmtp - procmail - ]; - - users.users."${user}" = {isNormalUser = true;}; - - systemd.tmpfiles.rules = [ - "d /home/${user}/mail 0700 ${user} users - -" - "L /home/${user}/.fetchmailrc - - - - /etc/homeSetup/.fetchmailrc" - "L /home/${user}/.procmailrc - - - - /etc/homeSetup/.procmailrc" - "L /home/${user}/.msmtprc - - - - /etc/homeSetup/.msmtprc" - ]; - - environment.etc = { - "homeSetup/.fetchmailrc" = { - text = '' - poll "${domainIp}" protocol IMAP - username "${user}" - password "${user}-password" - ssl - mda procmail; - ''; - mode = "0600"; - inherit user; - }; - "homeSetup/.procmailrc" = { - text = '' - DEFAULT=$HOME/mail - ''; - mode = "0600"; - inherit user; - }; - "homeSetup/.msmtprc" = { - text = '' - account ${user} - host ${domainIp} - port 465 - from ${user}@${domain} - user ${user} - password ${user}-password - auth on - tls on - tls_starttls off - ''; - mode = "0600"; - inherit user; - }; - }; - }; -in - nixos-lib.runTest { - # Wait until we actually use stalwart again - meta.broken = true; - - hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs - - name = "email"; - - node = { - specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;}; - - # Use the nixpkgs as constructed by the `nixpkgs.*` options - pkgs = null; - }; - - nodes = { - server = {config, ...}: { - imports = - extraModules - ++ [ - ../../../../modules - ]; - - vhack = { - nginx = { - enable = true; - selfsign = true; - }; - - stalwart-mail = { - enable = true; - fqdn = domain; - admin = "mailto:admin@${domain}"; - security = null; - openFirewall = true; - principals = [ - { - class = "individual"; - name = "alice"; - secret = "{PLAIN}alice-password"; - email = ["alice@${domain}"]; - } - { - class = "individual"; - name = "bob"; - secret = "{PLAIN}bob-password"; - email = ["bob@${domain}"]; - } - ]; - }; - }; - }; - - alice = mkUser "alice"; - bob = mkUser "bob"; - }; - - testScript = {...}: - /* - python - */ - '' - start_all() - - server.wait_for_unit("stalwart-mail.service") - server.wait_for_open_port(993) # imap - server.wait_for_open_port(465) # smtp - - with subtest("Both start without mail"): - alice.succeed("sudo -u alice ${scripts.checkEmailEmpty}") - bob.succeed("sudo -u bob ${scripts.checkEmailEmpty}") - - with subtest("Alice can send an email to bob"): - alice.succeed("sudo -u alice ${pkgs.writeShellScript "alice-send" '' - set -xe - - cat << EOF | msmtp --debug --account alice --tls-certcheck=off bob@${domain} >&2 - Hi Bob! - - This is an email. - It contains a subject and a body. - - ALICE - EOF - ''}") - bob.succeed("sudo -u bob ${pkgs.writeShellScript "bob-receive" '' - set -xe - - fetchmail --nosslcertck --verbose >&2 || { - echo New Mail did not arrive - exit 1 - } - ''}") - - server.copy_from_vm("/var/lib/", "server") - bob.copy_from_vm("/home/bob/mail", "bob") - ''; - } -- cgit v1.3.1