1let
2 certs = import ./common/acme/server/snakeoil-certs.nix;
3 domain = certs.domain;
4in
5{ pkgs, ... }:
6{
7 name = "alps";
8 meta = with pkgs.lib.maintainers; {
9 maintainers = [ hmenke ];
10 };
11
12 nodes = {
13 server = {
14 imports = [ ./common/user-account.nix ];
15 security.pki.certificateFiles = [
16 certs.ca.cert
17 ];
18 networking.extraHosts = ''
19 127.0.0.1 ${domain}
20 '';
21 networking.firewall.allowedTCPPorts = [
22 25
23 465
24 993
25 ];
26 services.postfix = {
27 enable = true;
28 enableSubmission = true;
29 enableSubmissions = true;
30 tlsTrustedAuthorities = "${certs.ca.cert}";
31 sslCert = "${certs.${domain}.cert}";
32 sslKey = "${certs.${domain}.key}";
33 };
34 services.dovecot2 = {
35 enable = true;
36 enableImap = true;
37 sslCACert = "${certs.ca.cert}";
38 sslServerCert = "${certs.${domain}.cert}";
39 sslServerKey = "${certs.${domain}.key}";
40 };
41 };
42
43 client =
44 { nodes, config, ... }:
45 {
46 security.pki.certificateFiles = [
47 certs.ca.cert
48 ];
49 networking.extraHosts = ''
50 ${nodes.server.config.networking.primaryIPAddress} ${domain}
51 '';
52 services.alps = {
53 enable = true;
54 theme = "alps";
55 imaps = {
56 host = domain;
57 port = 993;
58 };
59 smtps = {
60 host = domain;
61 port = 465;
62 };
63 };
64 environment.systemPackages = [
65 (pkgs.writers.writePython3Bin "test-alps-login" { } ''
66 from urllib.request import build_opener, HTTPCookieProcessor, Request
67 from urllib.parse import urlencode, urljoin
68 from http.cookiejar import CookieJar
69
70 baseurl = "http://localhost:${toString config.services.alps.port}"
71 username = "alice"
72 password = "${nodes.server.config.users.users.alice.password}"
73 cookiejar = CookieJar()
74 cookieprocessor = HTTPCookieProcessor(cookiejar)
75 opener = build_opener(cookieprocessor)
76
77 data = urlencode({"username": username, "password": password}).encode()
78 req = Request(urljoin(baseurl, "login"), data=data, method="POST")
79 with opener.open(req) as ret:
80 # Check that the alps_session cookie is set
81 print(cookiejar)
82 assert any(cookie.name == "alps_session" for cookie in cookiejar)
83
84 req = Request(baseurl)
85 with opener.open(req) as ret:
86 # Check that the alps_session cookie is still there...
87 print(cookiejar)
88 assert any(cookie.name == "alps_session" for cookie in cookiejar)
89 # ...and that we have not been redirected back to the login page
90 print(ret.url)
91 assert ret.url == urljoin(baseurl, "mailbox/INBOX")
92
93 req = Request(urljoin(baseurl, "logout"))
94 with opener.open(req) as ret:
95 # Check that the alps_session cookie is now gone
96 print(cookiejar)
97 assert all(cookie.name != "alps_session" for cookie in cookiejar)
98 '')
99 ];
100 };
101 };
102
103 testScript =
104 { nodes, ... }:
105 ''
106 server.start()
107 server.wait_for_unit("postfix.service")
108 server.wait_for_unit("dovecot2.service")
109 server.wait_for_open_port(465)
110 server.wait_for_open_port(993)
111
112 client.start()
113 client.wait_for_unit("alps.service")
114 client.wait_for_open_port(${toString nodes.client.config.services.alps.port})
115 client.succeed("test-alps-login")
116 '';
117}