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
31 settings.main = {
32 smtp_tls_CAfile = "${certs.ca.cert}";
33 smtpd_tls_chain_files = [
34 "${certs.${domain}.key}"
35 "${certs.${domain}.cert}"
36 ];
37 };
38 };
39 services.dovecot2 = {
40 enable = true;
41 enableImap = true;
42 sslCACert = "${certs.ca.cert}";
43 sslServerCert = "${certs.${domain}.cert}";
44 sslServerKey = "${certs.${domain}.key}";
45 };
46 };
47
48 client =
49 { nodes, config, ... }:
50 {
51 security.pki.certificateFiles = [
52 certs.ca.cert
53 ];
54 networking.extraHosts = ''
55 ${nodes.server.config.networking.primaryIPAddress} ${domain}
56 '';
57 services.alps = {
58 enable = true;
59 theme = "alps";
60 imaps = {
61 host = domain;
62 port = 993;
63 };
64 smtps = {
65 host = domain;
66 port = 465;
67 };
68 };
69 environment.systemPackages = [
70 (pkgs.writers.writePython3Bin "test-alps-login" { } ''
71 from urllib.request import build_opener, HTTPCookieProcessor, Request
72 from urllib.parse import urlencode, urljoin
73 from http.cookiejar import CookieJar
74
75 baseurl = "http://localhost:${toString config.services.alps.port}"
76 username = "alice"
77 password = "${nodes.server.config.users.users.alice.password}"
78 cookiejar = CookieJar()
79 cookieprocessor = HTTPCookieProcessor(cookiejar)
80 opener = build_opener(cookieprocessor)
81
82 data = urlencode({"username": username, "password": password}).encode()
83 req = Request(urljoin(baseurl, "login"), data=data, method="POST")
84 with opener.open(req) as ret:
85 # Check that the alps_session cookie is set
86 print(cookiejar)
87 assert any(cookie.name == "alps_session" for cookie in cookiejar)
88
89 req = Request(baseurl)
90 with opener.open(req) as ret:
91 # Check that the alps_session cookie is still there...
92 print(cookiejar)
93 assert any(cookie.name == "alps_session" for cookie in cookiejar)
94 # ...and that we have not been redirected back to the login page
95 print(ret.url)
96 assert ret.url == urljoin(baseurl, "mailbox/INBOX")
97
98 req = Request(urljoin(baseurl, "logout"))
99 with opener.open(req) as ret:
100 # Check that the alps_session cookie is now gone
101 print(cookiejar)
102 assert all(cookie.name != "alps_session" for cookie in cookiejar)
103 '')
104 ];
105 };
106 };
107
108 testScript =
109 { nodes, ... }:
110 ''
111 server.start()
112 server.wait_for_unit("postfix.service")
113 server.wait_for_unit("dovecot2.service")
114 server.wait_for_open_port(465)
115 server.wait_for_open_port(993)
116
117 client.start()
118 client.wait_for_unit("alps.service")
119 client.wait_for_open_port(${toString nodes.client.config.services.alps.port})
120 client.succeed("test-alps-login")
121 '';
122}