vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / mail / dkimproxy-out.nix
blob1d6a143dc836325c97312957f7fbab8de374a186
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.dkimproxy-out;
4   keydir = "/var/lib/dkimproxy-out";
5   privkey = "${keydir}/private.key";
6   pubkey = "${keydir}/public.key";
7 in
9   ##### interface
10   options = {
11     services.dkimproxy-out = {
12       enable = lib.mkOption {
13         type = lib.types.bool;
14         default = false;
15         description = ''
16             Whether to enable dkimproxy_out.
18             Note that a key will be auto-generated, and can be found in
19             ${keydir}.
20           '';
21       };
23       listen = lib.mkOption {
24         type = lib.types.str;
25         example = "127.0.0.1:10027";
26         description = "Address:port DKIMproxy should listen on.";
27       };
29       relay = lib.mkOption {
30         type = lib.types.str;
31         example = "127.0.0.1:10028";
32         description = "Address:port DKIMproxy should forward mail to.";
33       };
35       domains = lib.mkOption {
36         type = with lib.types; listOf str;
37         example = [ "example.org" "example.com" ];
38         description = "List of domains DKIMproxy can sign for.";
39       };
41       selector = lib.mkOption {
42         type = lib.types.str;
43         example = "selector1";
44         description = ''
45             The selector to use for DKIM key identification.
47             For example, if 'selector1' is used here, then for each domain
48             'example.org' given in `domain`, 'selector1._domainkey.example.org'
49             should contain the TXT record indicating the public key is the one
50             in ${pubkey}: "v=DKIM1; t=s; p=[THE PUBLIC KEY]".
51           '';
52       };
54       keySize = lib.mkOption {
55         type = lib.types.int;
56         default = 2048;
57         description = ''
58             Size of the RSA key to use to sign outgoing emails. Note that the
59             maximum mandatorily verified as per RFC6376 is 2048.
60           '';
61       };
63       # TODO: allow signature for other schemes than dkim(c=relaxed/relaxed)?
64       # This being the scheme used by gmail, maybe nothing more is needed for
65       # reasonable use.
66     };
67   };
69   ##### implementation
70   config = let
71     configfile = pkgs.writeText "dkimproxy_out.conf"
72       ''
73         listen ${cfg.listen}
74         relay ${cfg.relay}
76         domain ${lib.concatStringsSep "," cfg.domains}
77         selector ${cfg.selector}
79         signature dkim(c=relaxed/relaxed)
81         keyfile ${privkey}
82       '';
83   in
84     lib.mkIf cfg.enable {
85       users.groups.dkimproxy-out = {};
86       users.users.dkimproxy-out = {
87         description = "DKIMproxy_out daemon";
88         group = "dkimproxy-out";
89         isSystemUser = true;
90       };
92       systemd.services.dkimproxy-out = {
93         description = "DKIMproxy_out";
94         wantedBy = [ "multi-user.target" ];
95         preStart = ''
96           if [ ! -d "${keydir}" ]; then
97             mkdir -p "${keydir}"
98             chmod 0700 "${keydir}"
99             ${pkgs.openssl}/bin/openssl genrsa -out "${privkey}" ${toString cfg.keySize}
100             ${pkgs.openssl}/bin/openssl rsa -in "${privkey}" -pubout -out "${pubkey}"
101             chown -R dkimproxy-out:dkimproxy-out "${keydir}"
102           fi
103         '';
104         script = ''
105           exec ${pkgs.dkimproxy}/bin/dkimproxy.out --conf_file=${configfile}
106         '';
107         serviceConfig = {
108           User = "dkimproxy-out";
109           PermissionsStartOnly = true;
110         };
111       };
112     };
114   meta.maintainers = with lib.maintainers; [ ekleog ];