1{ lib, pkgs, ... }:
2{
3 name = "cyrus-imap";
4
5 meta = {
6 maintainers = with lib.maintainers; [ moraxyc ];
7 };
8
9 nodes.machine =
10 { pkgs, ... }:
11 {
12 environment.systemPackages = with pkgs; [
13 curl
14 sudo
15 ];
16 services.saslauthd = {
17 enable = true;
18 config = ''
19 DESC="SASL Authentication Daemon"
20 NAME="saslauthd"
21 MECH_OPTIONS=""
22 THREADS=5
23 START=yes
24 OPTIONS="-c -m /run/saslauthd"
25 '';
26 };
27 services.cyrus-imap = {
28 enable = true;
29 cyrusSettings = {
30 START = {
31 recover = {
32 cmd = [
33 "ctl_cyrusdb"
34 "-r"
35 ];
36 };
37 };
38 EVENTS = {
39 tlsprune = {
40 cmd = [ "tls_prune" ];
41 at = 400;
42 };
43 delprune = {
44 cmd = [
45 "cyr_expire"
46 "-E"
47 "3"
48 ];
49 at = 400;
50 };
51 deleteprune = {
52 cmd = [
53 "cyr_expire"
54 "-E"
55 "4"
56 "-D"
57 "28"
58 ];
59 at = 430;
60 };
61 expungeprune = {
62 cmd = [
63 "cyr_expire"
64 "-E"
65 "4"
66 "-X"
67 "28"
68 ];
69 at = 445;
70 };
71 checkpoint = {
72 cmd = [
73 "ctl_cyrusdb"
74 "-c"
75 ];
76 period = 30;
77 };
78 };
79 SERVICES = {
80 http = {
81 cmd = [ "httpd" ];
82 listen = "80";
83 prefork = 0;
84 };
85 imap = {
86 cmd = [ "imapd" ];
87 listen = "143";
88 prefork = 0;
89 };
90 lmtpunix = {
91 cmd = [ "lmtpd" ];
92 listen = "/run/cyrus/lmtp";
93 prefork = 0;
94 };
95 notify = {
96 cmd = [ "notifyd" ];
97 listen = "/run/cyrus/notify";
98 proto = "udp";
99 prefork = 0;
100 };
101 };
102 };
103 };
104 };
105
106 testScript = ''
107 machine.wait_for_unit("saslauthd.service")
108 machine.wait_for_unit("cyrus-imap.service")
109
110 machine.wait_for_open_port(80)
111 machine.wait_for_open_port(143)
112
113 machine.succeed("echo 'secret' | ${lib.getExe' pkgs.cyrus_sasl.bin "saslpasswd2"} -p -c cyrus")
114 machine.succeed("chown cyrus /etc/sasldb2")
115
116 machine.succeed("sudo -ucyrus curl --fail --max-time 10 imap://cyrus:secret@localhost:143")
117 machine.fail("curl --fail --max-time 10 imap://cyrus:wrongsecret@localhost:143")
118 machine.fail("curl --fail --max-time 10 -X PROPFIND -H 'Depth: 1' 'http://localhost/dav/addressbooks/user/cyrus@localhost/Default'")
119 '';
120}