1{ ... }:
2
3let
4 cert =
5 pkgs:
6 pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
7 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \
8 -subj '/C=GB/CN=example.com/CN=uploads.example.com/CN=conference.example.com' -addext "subjectAltName = DNS:example.com,DNS:uploads.example.com,DNS:conference.example.com"
9 mkdir -p $out
10 cp key.pem cert.pem $out
11 '';
12
13 # Creates and set password for the 2 xmpp test users.
14 #
15 # Doing that in a bash script instead of doing that in the test
16 # script allow us to easily provision the users when running that
17 # test interactively.
18 createUsers =
19 pkgs:
20 pkgs.writeShellScriptBin "create-prosody-users" ''
21 set -e
22 prosodyctl register cthon98 example.com nothunter2
23 prosodyctl register azurediamond example.com hunter2
24 '';
25 # Deletes the test users.
26 delUsers =
27 pkgs:
28 pkgs.writeShellScriptBin "delete-prosody-users" ''
29 set -e
30 prosodyctl deluser cthon98@example.com
31 prosodyctl deluser azurediamond@example.com
32 '';
33in
34{
35 name = "prosody";
36 nodes = {
37 client-a =
38 { nodes, pkgs, ... }:
39 {
40 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
41 networking.extraHosts = ''
42 ${nodes.server.networking.primaryIPAddress} example.com
43 '';
44
45 imports = [ ./go-sendxmpp-listen.nix ];
46 };
47
48 client-b =
49 {
50 nodes,
51 pkgs,
52 ...
53 }:
54 {
55 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
56 networking.extraHosts = ''
57 ${nodes.server.networking.primaryIPAddress} example.com
58 ${nodes.server.networking.primaryIPAddress} conference.example.com
59 ${nodes.server.networking.primaryIPAddress} uploads.example.com
60 '';
61 environment.systemPackages = [
62 (pkgs.callPackage ./xmpp-sendmessage.nix { connectTo = "example.com"; })
63 ];
64 };
65
66 server =
67 { config, pkgs, ... }:
68 {
69 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
70 networking.extraHosts = ''
71 ${config.networking.primaryIPAddress} example.com
72 ${config.networking.primaryIPAddress} conference.example.com
73 ${config.networking.primaryIPAddress} uploads.example.com
74 '';
75 networking.firewall.enable = false;
76 environment.systemPackages = [
77 (createUsers pkgs)
78 (delUsers pkgs)
79 ];
80 services.prosody = {
81 enable = true;
82 ssl.cert = "${cert pkgs}/cert.pem";
83 ssl.key = "${cert pkgs}/key.pem";
84 virtualHosts.example = {
85 domain = "example.com";
86 enabled = true;
87 ssl.cert = "${cert pkgs}/cert.pem";
88 ssl.key = "${cert pkgs}/key.pem";
89 };
90 muc = [
91 {
92 domain = "conference.example.com";
93 }
94 ];
95 httpFileShare = {
96 domain = "uploads.example.com";
97 };
98 };
99 };
100 };
101
102 testScript = _: ''
103 # Check with sqlite storage
104 start_all()
105 server.wait_for_unit("prosody.service")
106 server.succeed('prosodyctl status | grep "Prosody is running"')
107
108 server.succeed("create-prosody-users")
109
110 for machine in client_a, client_b:
111 machine.systemctl("start network-online.target")
112 machine.wait_for_unit("network-online.target")
113
114 client_a.wait_for_unit("go-sendxmpp-listen")
115 client_b.succeed("send-message")
116
117 client_a.wait_until_succeeds(
118 "journalctl -o cat -u go-sendxmpp-listen.service | grep 'cthon98@example.com: Hello, this is dog.'"
119 )
120
121 server.succeed("delete-prosody-users")
122 '';
123}