at master 3.8 kB view raw
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}