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