{ config, lib, pkgs, ... }: let cfg = config.sbruder.mailserver; configFile = pkgs.writeText "config-v1.1.xml" '' ${lib.escapeXML cfg.autoconfig.domain} ${lib.escapeXML cfg.autoconfig.displayName} ${lib.escapeXML cfg.autoconfig.displayShortName} ${lib.escapeXML cfg.fqdn} 993 SSL password-cleartext %EMAILADDRESS% ${lib.escapeXML cfg.fqdn} 465 SSL password-cleartext %EMAILADDRESS% ''; in { options.sbruder.mailserver.autoconfig = { enable = lib.mkEnableOption "autoconfiguration of compatible clients. Requires autoconfig. to exist for all specified domains"; domain = lib.mkOption { type = lib.types.str; description = "Domain of the mail system."; example = "example.com"; }; displayName = lib.mkOption { type = lib.types.str; description = "Name of the mail system."; default = cfg.autoconfig.domain; }; displayShortName = lib.mkOption { type = lib.types.str; description = "Short name of the mail system."; default = cfg.autoconfig.displayName; }; }; config = lib.mkIf cfg.enable { services.nginx = lib.mkIf cfg.autoconfig.enable { enable = true; virtualHosts = lib.listToAttrs (map (domain: lib.nameValuePair "autoconfig.${domain}" { enableACME = true; forceSSL = true; locations."=/mail/config-v1.1.xml".alias = configFile; }) cfg.domains); }; }; }