73 lines
1.9 KiB
Nix
73 lines
1.9 KiB
Nix
{
|
|
config,
|
|
pkgs,
|
|
lib,
|
|
...
|
|
}: let
|
|
inherit (lib.modules) mkIf;
|
|
inherit (lib.strings) concatStringsSep;
|
|
inherit (lib.attrsets) mapAttrsToList;
|
|
|
|
mailConfig = config.services.mailserver;
|
|
|
|
inherit (mailConfig) vmail;
|
|
vmailUser = vmail.user;
|
|
vmailGroup = vmail.group;
|
|
|
|
inherit (mailConfig) sieveDirectory;
|
|
|
|
scriptForUser = name: config:
|
|
if builtins.isString config.sieveScript
|
|
then ''
|
|
cat ${builtins.toFile "default.sieve" config.sieveScript} > "${sieveDirectory}/${name}/default.sieve"
|
|
chown "${vmailUser}:${vmailGroup}" "${sieveDirectory}/${name}/default.sieve"
|
|
''
|
|
else ''
|
|
if [ -f "${sieveDirectory}/${name}/default.sieve" ]; then
|
|
rm "${sieveDirectory}/${name}/default.sieve"
|
|
fi
|
|
if [ -f "${sieveDirectory}/${name}.svbin" ]; then
|
|
rm "${sieveDirectory}/${name}/default.svbin"
|
|
fi
|
|
'';
|
|
|
|
virtualMailUsersActivationScript = pkgs.writeScript "activate-virtual-mail-users" ''
|
|
#!${pkgs.stdenv.shell}
|
|
|
|
set -euo pipefail
|
|
|
|
${concatStringsSep "\n" (mapAttrsToList (name: config: scriptForUser name config) mailConfig.accounts)}
|
|
'';
|
|
in {
|
|
config = mkIf mailConfig.enable {
|
|
users.users."${vmailUser}" = {
|
|
isSystemUser = true;
|
|
|
|
home = vmail.directory;
|
|
createHome = true;
|
|
|
|
uid = vmail.userID;
|
|
group = "${vmailGroup}";
|
|
};
|
|
|
|
users.groups."${vmailGroup}" = {
|
|
gid = vmail.groupID;
|
|
};
|
|
|
|
systemd.tmpfiles.rules =
|
|
[
|
|
"d '${sieveDirectory}' - ${vmailUser} ${vmailGroup} - -"
|
|
]
|
|
++ (map (
|
|
email: "d '${sieveDirectory}/${email}' 770 ${vmailUser} ${vmailGroup} - -"
|
|
) (builtins.attrNames mailConfig.accounts));
|
|
|
|
systemd.services.activate-virtual-mail-users = {
|
|
wantedBy = ["multi-user.target"];
|
|
before = ["dovecot2.service"];
|
|
serviceConfig.ExecStart = virtualMailUsersActivationScript;
|
|
enable = true;
|
|
};
|
|
};
|
|
}
|