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