Remove accounts.<name>.aliases and rename extraVirtualAliases to virtualAccountAliases
Some checks failed
Test / tests (push) Failing after 3m0s

In order to simplify configuration and reduce configuration variability,
this commit removes the option to directly add aliases to each single
mail account. Instead, aliaes should be centrally configured using the
option 'virtualAccountAliases'.
This commit is contained in:
Thomas Preisner 2025-01-06 23:29:40 +01:00
parent 28796695af
commit faf6f549b0
3 changed files with 15 additions and 53 deletions

View file

@ -92,17 +92,6 @@ in {
''; '';
}; };
aliases = lib.mkOption {
type = with lib.types; listOf types.str;
example = ["abuse@example.com" "postmaster@example.com"];
default = [];
description = ''
A list of aliases of this login account.
Note: Use list entries like "@example.com" to create a catchAll
that allows sending from all email addresses in these domain.
'';
};
isSystemUser = lib.mkOption { isSystemUser = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
default = false; default = false;
@ -153,7 +142,7 @@ in {
default = {}; default = {};
}; };
extraVirtualAliases = lib.mkOption { virtualAccountAliases = lib.mkOption {
type = let type = let
account = lib.mkOptionType { account = lib.mkOptionType {
name = "Mail Account"; name = "Mail Account";

View file

@ -21,25 +21,15 @@ with (import ./common.nix {inherit config;}); let
mergeLookupTables = tables: lib.zipAttrsWith (n: v: lib.flatten v) tables; mergeLookupTables = tables: lib.zipAttrsWith (n: v: lib.flatten v) tables;
account_virtual_aliases = mergeLookupTables (lib.flatten (lib.mapAttrsToList virtual_accounts = mergeLookupTables (lib.map (name: {"${name}" = name;}) (lib.attrNames cfg.accounts));
(name: value: let virtual_account_aliases = attrsToLookupTable cfg.virtualAccountAliases;
to = name;
in
map (from: {"${from}" = to;}) (value.aliases ++ lib.singleton name))
cfg.accounts));
virtual_domain_aliases = let virtual_domain_aliases = let
alias_domains = alias_domains = lib.mapAttrs' (src: dst: lib.nameValuePair "@${src}" "@${dst}") cfg.virtualDomainAliases;
lib.concatMapAttrs (src: dst: {
"@${src}" = "@${dst}";
})
cfg.virtualDomainAliases;
in in
attrsToLookupTable alias_domains; attrsToLookupTable alias_domains;
extra_virtual_aliases = attrsToLookupTable cfg.extraVirtualAliases; all_virtual_aliases = mergeLookupTables [virtual_accounts virtual_account_aliases virtual_domain_aliases];
all_virtual_aliases = mergeLookupTables [account_virtual_aliases virtual_domain_aliases extra_virtual_aliases];
aliases_file = let aliases_file = let
content = lookupTableToString all_virtual_aliases; content = lookupTableToString all_virtual_aliases;

View file

@ -1,5 +1,6 @@
{pkgs, ...}: {pkgs, ...}:
with (import ./common/lib.nix {inherit pkgs;}); let with (import ./common/lib.nix {inherit pkgs;}); let
lib = pkgs.lib;
accounts = { accounts = {
"normal" = { "normal" = {
address = "user1@example.com"; address = "user1@example.com";
@ -11,32 +12,23 @@ with (import ./common/lib.nix {inherit pkgs;}); let
}; };
"alias" = { "alias" = {
address = "user3@example.com"; address = "user3@example.com";
aliases = ["alias@example.com"];
password = "secret-password3"; password = "secret-password3";
}; };
"extra-alias" = {
address = "user4@example.com";
password = "secret-password4;";
};
"multi-alias1" = { "multi-alias1" = {
address = "multi-alias1@example.com"; address = "multi-alias1@example.com";
aliases = ["multi-alias@example.com"]; password = "secret-password4;";
password = "secret-password5;";
}; };
"multi-alias2" = { "multi-alias2" = {
address = "multi-alias2@example.com"; address = "multi-alias2@example.com";
aliases = ["multi-alias@example.com"]; password = "secret-password5;";
password = "secret-password6;";
}; };
"catchall" = { "catchall" = {
address = "catchall@example.com"; address = "catchall@example.com";
aliases = ["@example.com"]; password = "secret-password6;";
password = "secret-password7;";
}; };
"otherdomain" = { "otherdomain" = {
address = "otherdomain@example.com"; address = "otherdomain@example.com";
aliases = ["user@otherdomain.com"]; password = "secret-password7;";
password = "secret-password8;";
}; };
}; };
in in
@ -53,8 +45,11 @@ in
virtualDomainAliases = { virtualDomainAliases = {
"aliased.com" = "example.com"; "aliased.com" = "example.com";
}; };
extraVirtualAliases = { virtualAccountAliases = {
"extra-alias@example.com" = accounts."extra-alias".address; "alias@example.com" = accounts."alias".address;
"multi-alias@example.com" = lib.map (x: accounts.${x}.address) ["multi-alias1" "multi-alias2"];
"@example.com" = accounts."catchall".address;
"user@otherdomain.com" = accounts."otherdomain".address;
}; };
}; };
}; };
@ -182,18 +177,6 @@ in
# fetchmail returns EXIT_CODE 0 when it retrieves mail # fetchmail returns EXIT_CODE 0 when it retrieves mail
client.succeed("${recvMail "otherdomain"} >&2") client.succeed("${recvMail "otherdomain"} >&2")
with subtest("mail incoming on extraVirtualAlias"):
client.succeed("${sendMail "normal" "" "extra-alias@example.com" ''
Subject: extraVirtualAliases-Test
Hello User4,
this is mail is sent to you by using an extraVirtualAlias as recipient.
''}")
server.wait_until_fails('${pendingPostqueue}')
client.execute("${cleanupMail}")
# fetchmail returns EXIT_CODE 0 when it retrieves mail
client.succeed("${recvMail "extra-alias"} >&2")
with subtest("receiving mail on aliased domain using normal account"): with subtest("receiving mail on aliased domain using normal account"):
client.succeed("${sendMail "normal" "" "user2@aliased.com" '' client.succeed("${sendMail "normal" "" "user2@aliased.com" ''
Subject: aliasedDomain with normal account Subject: aliasedDomain with normal account