summaryrefslogtreecommitdiffstats
path: root/krebs/3modules/exim-retiolum.nix
blob: 71c0919176f0e27c0096fd0b29dcc4932bb5379e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
{ config, pkgs, lib, ... }:

with builtins;
with lib;
let
  cfg = config.krebs.exim-retiolum;

  out = {
    options.krebs.exim-retiolum = api;
    config =
      # This configuration makes only sense for retiolum-enabled hosts.
      # TODO modular configuration
      mkIf cfg.enable (
        #assert config.krebs.retiolum.enable;
        imp);
  };

  api = {
    enable = mkEnableOption "krebs.exim-retiolum";
  };

  imp = {
    services.exim = {
      enable = true;
      config = ''
        primary_hostname = ${retiolumHostname}
        domainlist local_domains    = @ : localhost
        domainlist relay_to_domains = *.retiolum
        hostlist   relay_from_hosts = <; 127.0.0.1 ; ::1

        acl_smtp_rcpt = acl_check_rcpt
        acl_smtp_data = acl_check_data

        host_lookup = *
        rfc1413_hosts = *
        rfc1413_query_timeout = 5s

        log_file_path = syslog
        syslog_timestamp = false
        syslog_duplication = false

        begin acl

        acl_check_rcpt:
          accept  hosts = :
                  control = dkim_disable_verify

          deny    message       = Restricted characters in address
                  domains       = +local_domains
                  local_parts   = ^[.] : ^.*[@%!/|]

          deny    message       = Restricted characters in address
                  domains       = !+local_domains
                  local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

          accept  local_parts   = postmaster
                  domains       = +local_domains

          #accept
          #  hosts = *.retiolum
          #  domains = *.retiolum
          #  control = dkim_disable_verify

          #require verify        = sender

          accept  hosts         = +relay_from_hosts
                  control       = submission
                  control       = dkim_disable_verify

          accept  authenticated = *
                  control       = submission
                  control       = dkim_disable_verify

          require message = relay not permitted
                  domains = +local_domains : +relay_to_domains

          require verify = recipient

          accept


        acl_check_data:
          accept


        begin routers

        retiolum:
          driver = manualroute
          domains = ! ${retiolumHostname} : *.retiolum
          transport = remote_smtp
          route_list = ^.* $0 byname
          no_more

        nonlocal:
          debug_print = "R: nonlocal for $local_part@$domain"
          driver = redirect
          domains = ! +local_domains
          allow_fail
          data = :fail: Mailing to remote domains not supported
          no_more

        local_user:
          # debug_print = "R: local_user for $local_part@$domain"
          driver = accept
          check_local_user
        # local_part_suffix = +* : -*
        # local_part_suffix_optional
          transport = home_maildir
          cannot_route_message = Unknown user


        begin transports

        remote_smtp:
          driver = smtp

        home_maildir:
          driver = appendfile
          maildir_format
          directory = $home/Maildir
          directory_mode = 0700
          delivery_date_add
          envelope_to_add
          return_path_add
        # group = mail
        # mode = 0660

        begin retry
        *.retiolum             *           F,42d,1m
        *                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h

        begin rewrite

        begin authenticators
      '';
    };
  };

  # TODO get the hostname from somewhere else.
  retiolumHostname = "${config.networking.hostName}.retiolum";
in
out