aboutsummaryrefslogtreecommitdiffstats
path: root/tests/by-name/em
diff options
context:
space:
mode:
Diffstat (limited to 'tests/by-name/em')
-rw-r--r--tests/by-name/em/email-dns/nodes/mail_server.nix52
-rw-r--r--tests/by-name/em/email-dns/nodes/name_server.nix292
-rw-r--r--tests/by-name/em/email-dns/nodes/user.nix70
-rw-r--r--tests/by-name/em/email-dns/test.nix170
-rw-r--r--tests/by-name/em/email-http/nodes/mail_server.nix57
-rw-r--r--tests/by-name/em/email-http/nodes/user.nix26
-rw-r--r--tests/by-name/em/email-http/test.nix103
-rw-r--r--tests/by-name/em/email-ip/test.nix177
8 files changed, 0 insertions, 947 deletions
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")
- '';
- }