diff --git a/mail-server/dovecot.nix b/mail-server/dovecot.nix index deb7bca..a9c01c7 100644 --- a/mail-server/dovecot.nix +++ b/mail-server/dovecot.nix @@ -346,7 +346,19 @@ in "sieve_script default" = { # declarative type = "default"; - path = "${cfg.sieveDirectory}/%{user}/default.sieve"; + name = "default"; + # TODO: Pre-compile Sieve scripts with 'sievec' (requires a Dovecot config in build sandbox) + path = "${ + pkgs.runCommand "declarative-sieve-scripts" { } ( + '' + mkdir "$out" + '' + + lib.concatMapAttrsStringSep "\n" (_: value: '' + mkdir "$out/${value.name}" + cp -v "${builtins.toFile "default.sieve" value.sieveScript}" "$out/${value.name}/default.sieve" + '') (lib.filterAttrs (_: value: value.sieveScript != null) cfg.accounts) + ) + }/%{user}/default.sieve"; }; "sieve_script personal" = { diff --git a/mail-server/users.nix b/mail-server/users.nix index 163943e..4d20e9f 100644 --- a/mail-server/users.nix +++ b/mail-server/users.nix @@ -41,33 +41,6 @@ let chown "${cfg.storage.owner}:${cfg.storage.group}" "${cfg.sieveDirectory}" chmod 770 "${cfg.sieveDirectory}" fi - - # Copy user's sieve script to the correct location (if it exists). If it - # is null, remove the file. - ${lib.concatMapStringsSep "\n" ( - { name, sieveScript }: - if lib.isString sieveScript then - '' - if (! test -d "${cfg.sieveDirectory}/${name}"); then - mkdir -p "${cfg.sieveDirectory}/${name}" - chown "${cfg.storage.owner}:${cfg.storage.group}" "${cfg.sieveDirectory}/${name}" - chmod 770 "${cfg.sieveDirectory}/${name}" - fi - cat << 'EOF' > "${cfg.sieveDirectory}/${name}/default.sieve" - ${sieveScript} - EOF - chown "${cfg.storage.owner}:${cfg.storage.group}" "${cfg.sieveDirectory}/${name}/default.sieve" - '' - else - '' - if (test -f "${cfg.sieveDirectory}/${name}/default.sieve"); then - rm "${cfg.sieveDirectory}/${name}/default.sieve" - fi - if (test -f "${cfg.sieveDirectory}/${name}.svbin"); then - rm "${cfg.sieveDirectory}/${name}/default.svbin" - fi - '' - ) (map (user: { inherit (user) name sieveScript; }) (lib.attrValues cfg.accounts))} ''; in {