From faf6f549b0be2b1f2971ddce0bf7f6571d8f921e Mon Sep 17 00:00:00 2001 From: Thomas Preisner Date: Mon, 6 Jan 2025 23:29:40 +0100 Subject: [PATCH] Remove accounts..aliases and rename extraVirtualAliases to virtualAccountAliases 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'. --- mailsystem/default.nix | 13 +------------ mailsystem/postfix.nix | 18 ++++-------------- tests/aliases.nix | 37 ++++++++++--------------------------- 3 files changed, 15 insertions(+), 53 deletions(-) diff --git a/mailsystem/default.nix b/mailsystem/default.nix index 7d6231f..2dc96d9 100644 --- a/mailsystem/default.nix +++ b/mailsystem/default.nix @@ -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 { type = lib.types.bool; default = false; @@ -153,7 +142,7 @@ in { default = {}; }; - extraVirtualAliases = lib.mkOption { + virtualAccountAliases = lib.mkOption { type = let account = lib.mkOptionType { name = "Mail Account"; diff --git a/mailsystem/postfix.nix b/mailsystem/postfix.nix index 708ad31..3549afe 100644 --- a/mailsystem/postfix.nix +++ b/mailsystem/postfix.nix @@ -21,25 +21,15 @@ with (import ./common.nix {inherit config;}); let mergeLookupTables = tables: lib.zipAttrsWith (n: v: lib.flatten v) tables; - account_virtual_aliases = mergeLookupTables (lib.flatten (lib.mapAttrsToList - (name: value: let - to = name; - in - map (from: {"${from}" = to;}) (value.aliases ++ lib.singleton name)) - cfg.accounts)); + virtual_accounts = mergeLookupTables (lib.map (name: {"${name}" = name;}) (lib.attrNames cfg.accounts)); + virtual_account_aliases = attrsToLookupTable cfg.virtualAccountAliases; virtual_domain_aliases = let - alias_domains = - lib.concatMapAttrs (src: dst: { - "@${src}" = "@${dst}"; - }) - cfg.virtualDomainAliases; + alias_domains = lib.mapAttrs' (src: dst: lib.nameValuePair "@${src}" "@${dst}") cfg.virtualDomainAliases; in attrsToLookupTable alias_domains; - extra_virtual_aliases = attrsToLookupTable cfg.extraVirtualAliases; - - all_virtual_aliases = mergeLookupTables [account_virtual_aliases virtual_domain_aliases extra_virtual_aliases]; + all_virtual_aliases = mergeLookupTables [virtual_accounts virtual_account_aliases virtual_domain_aliases]; aliases_file = let content = lookupTableToString all_virtual_aliases; diff --git a/tests/aliases.nix b/tests/aliases.nix index 842991d..ba063e1 100644 --- a/tests/aliases.nix +++ b/tests/aliases.nix @@ -1,5 +1,6 @@ {pkgs, ...}: with (import ./common/lib.nix {inherit pkgs;}); let + lib = pkgs.lib; accounts = { "normal" = { address = "user1@example.com"; @@ -11,32 +12,23 @@ with (import ./common/lib.nix {inherit pkgs;}); let }; "alias" = { address = "user3@example.com"; - aliases = ["alias@example.com"]; password = "secret-password3"; }; - "extra-alias" = { - address = "user4@example.com"; - password = "secret-password4;"; - }; "multi-alias1" = { address = "multi-alias1@example.com"; - aliases = ["multi-alias@example.com"]; - password = "secret-password5;"; + password = "secret-password4;"; }; "multi-alias2" = { address = "multi-alias2@example.com"; - aliases = ["multi-alias@example.com"]; - password = "secret-password6;"; + password = "secret-password5;"; }; "catchall" = { address = "catchall@example.com"; - aliases = ["@example.com"]; - password = "secret-password7;"; + password = "secret-password6;"; }; "otherdomain" = { address = "otherdomain@example.com"; - aliases = ["user@otherdomain.com"]; - password = "secret-password8;"; + password = "secret-password7;"; }; }; in @@ -53,8 +45,11 @@ in virtualDomainAliases = { "aliased.com" = "example.com"; }; - extraVirtualAliases = { - "extra-alias@example.com" = accounts."extra-alias".address; + virtualAccountAliases = { + "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 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"): client.succeed("${sendMail "normal" "" "user2@aliased.com" '' Subject: aliasedDomain with normal account