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