vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / mail / postsrsd.nix
blobf94d3942b5e3ba13469274eade35fa57b111a30e
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.services.postsrsd;
6 in {
8   ###### interface
10   options = {
12     services.postsrsd = {
14       enable = lib.mkOption {
15         type = lib.types.bool;
16         default = false;
17         description = "Whether to enable the postsrsd SRS server for Postfix.";
18       };
20       secretsFile = lib.mkOption {
21         type = lib.types.path;
22         default = "/var/lib/postsrsd/postsrsd.secret";
23         description = "Secret keys used for signing and verification";
24       };
26       domain = lib.mkOption {
27         type = lib.types.str;
28         description = "Domain name for rewrite";
29       };
31       separator = lib.mkOption {
32         type = lib.types.enum ["-" "=" "+"];
33         default = "=";
34         description = "First separator character in generated addresses";
35       };
37       # bindAddress = lib.mkOption { # uncomment once 1.5 is released
38       #   type = lib.types.str;
39       #   default = "127.0.0.1";
40       #   description = "Socket listen address";
41       # };
43       forwardPort = lib.mkOption {
44         type = lib.types.int;
45         default = 10001;
46         description = "Port for the forward SRS lookup";
47       };
49       reversePort = lib.mkOption {
50         type = lib.types.int;
51         default = 10002;
52         description = "Port for the reverse SRS lookup";
53       };
55       timeout = lib.mkOption {
56         type = lib.types.int;
57         default = 1800;
58         description = "Timeout for idle client connections in seconds";
59       };
61       excludeDomains = lib.mkOption {
62         type = lib.types.listOf lib.types.str;
63         default = [];
64         description = "Origin domains to exclude from rewriting in addition to primary domain";
65       };
67       user = lib.mkOption {
68         type = lib.types.str;
69         default = "postsrsd";
70         description = "User for the daemon";
71       };
73       group = lib.mkOption {
74         type = lib.types.str;
75         default = "postsrsd";
76         description = "Group for the daemon";
77       };
79     };
81   };
84   ###### implementation
86   config = lib.mkIf cfg.enable {
88     services.postsrsd.domain = lib.mkDefault config.networking.hostName;
90     users.users = lib.optionalAttrs (cfg.user == "postsrsd") {
91       postsrsd = {
92         group = cfg.group;
93         uid = config.ids.uids.postsrsd;
94       };
95     };
97     users.groups = lib.optionalAttrs (cfg.group == "postsrsd") {
98       postsrsd.gid = config.ids.gids.postsrsd;
99     };
101     systemd.services.postsrsd = {
102       description = "PostSRSd SRS rewriting server";
103       after = [ "network.target" ];
104       before = [ "postfix.service" ];
105       wantedBy = [ "multi-user.target" ];
107       path = [ pkgs.coreutils ];
109       serviceConfig = {
110         ExecStart = ''${pkgs.postsrsd}/sbin/postsrsd "-s${cfg.secretsFile}" "-d${cfg.domain}" -a${cfg.separator} -f${toString cfg.forwardPort} -r${toString cfg.reversePort} -t${toString cfg.timeout} "-X${lib.concatStringsSep "," cfg.excludeDomains}"'';
111         User = cfg.user;
112         Group = cfg.group;
113         PermissionsStartOnly = true;
114       };
116       preStart = ''
117         if [ ! -e "${cfg.secretsFile}" ]; then
118           echo "WARNING: secrets file not found, autogenerating!"
119           DIR="$(dirname "${cfg.secretsFile}")"
120           install -m 750 -o ${cfg.user} -g ${cfg.group} -d "$DIR"
121           install -m 600 -o ${cfg.user} -g ${cfg.group} <(dd if=/dev/random bs=18 count=1 | base64) "${cfg.secretsFile}"
122         fi
123       '';
124     };
126   };