{ config, pkgs, lib, ... }: let mail_config = config.services.mailserver; vmail_config = mail_config.vmail_config; vmail_user = vmail_config.user; vmail_group = vmail_config.group; sieve_directory = mail_config.sieve_directory; virtualMailUsersActivationScript = pkgs.writeScript "activate-virtual-mail-users" '' #!${pkgs.stdenv.shell} set -euo pipefail # Create directory to store user sieve scripts if it doesn't exist if (! test -d "${sieve_directory}"); then mkdir "${sieve_directory}" chown "${vmail_user}:${vmail_group}" "${sieve_directory}" chmod 770 "${sieve_directory}" 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 "${sieve_directory}/${name}"); then mkdir -p "${sieve_directory}/${name}" chown "${vmail_user}:${vmail_group}" "${sieve_directory}/${name}" chmod 770 "${sieve_directory}/${name}" fi cat << 'EOF' > "${sieve_directory}/${name}/default.sieve" ${sieveScript} EOF chown "${vmail_user}:${vmail_group}" "${sieve_directory}/${name}/default.sieve" '' else '' if (test -f "${sieve_directory}/${name}/default.sieve"); then rm "${sieve_directory}/${name}/default.sieve" fi if (test -f "${sieve_directory}/${name}.svbin"); then rm "${sieve_directory}/${name}/default.svbin" fi '') (map (user: {inherit (user) name sieveScript;}) (lib.attrValues mail_config.accounts))} ''; in { config = lib.mkIf (mail_config.enable) { users.users."${vmail_user}" = { isSystemUser = true; home = vmail_config.directory; createHome = true; uid = vmail_config.user_id; group = "${vmail_group}"; }; users.groups."${vmail_group}" = {gid = vmail_config.group_id;}; systemd.services.activate-virtual-mail-users = { wantedBy = ["multi-user.target"]; before = ["dovecot2.service"]; serviceConfig = {ExecStart = virtualMailUsersActivationScript;}; enable = true; }; }; }