nixpkgs/nixos/tests/xmpp/prosody.nix
2025-08-17 13:59:12 +00:00

124 lines
3.6 KiB
Nix

{ ... }:
let
cert =
pkgs:
pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \
-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"
mkdir -p $out
cp key.pem cert.pem $out
'';
# Creates and set password for the 2 xmpp test users.
#
# Doing that in a bash script instead of doing that in the test
# script allow us to easily provision the users when running that
# test interactively.
createUsers =
pkgs:
pkgs.writeShellScriptBin "create-prosody-users" ''
set -e
prosodyctl register cthon98 example.com nothunter2
prosodyctl register azurediamond example.com hunter2
'';
# Deletes the test users.
delUsers =
pkgs:
pkgs.writeShellScriptBin "delete-prosody-users" ''
set -e
prosodyctl deluser cthon98@example.com
prosodyctl deluser azurediamond@example.com
'';
in
{
name = "prosody";
nodes = {
client-a =
{ nodes, pkgs, ... }:
{
security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
networking.extraHosts = ''
${nodes.server.networking.primaryIPAddress} example.com
'';
imports = [ ./go-sendxmpp-listen.nix ];
};
client-b =
{
nodes,
pkgs,
...
}:
{
security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
networking.extraHosts = ''
${nodes.server.networking.primaryIPAddress} example.com
${nodes.server.networking.primaryIPAddress} conference.example.com
${nodes.server.networking.primaryIPAddress} uploads.example.com
'';
environment.systemPackages = [
(pkgs.callPackage ./xmpp-sendmessage.nix { connectTo = "example.com"; })
];
};
server =
{ config, pkgs, ... }:
{
security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
networking.extraHosts = ''
${config.networking.primaryIPAddress} example.com
${config.networking.primaryIPAddress} conference.example.com
${config.networking.primaryIPAddress} uploads.example.com
'';
networking.firewall.enable = false;
environment.systemPackages = [
(createUsers pkgs)
(delUsers pkgs)
];
services.prosody = {
enable = true;
ssl.cert = "${cert pkgs}/cert.pem";
ssl.key = "${cert pkgs}/key.pem";
virtualHosts.example = {
domain = "example.com";
enabled = true;
ssl.cert = "${cert pkgs}/cert.pem";
ssl.key = "${cert pkgs}/key.pem";
};
muc = [
{
domain = "conference.example.com";
}
];
httpFileShare = {
domain = "uploads.example.com";
};
};
};
};
testScript = _: ''
# Check with sqlite storage
start_all()
server.wait_for_unit("prosody.service")
server.succeed('prosodyctl status | grep "Prosody is running"')
server.succeed("create-prosody-users")
for machine in client_a, client_b:
machine.systemctl("start network-online.target")
machine.wait_for_unit("network-online.target")
client_a.wait_for_unit("go-sendxmpp-listen")
client_b.succeed("send-message")
client_a.wait_until_succeeds(
"journalctl -o cat -u go-sendxmpp-listen.service | grep 'cthon98@example.com: Hello, this is dog.'"
)
server.succeed("delete-prosody-users")
'';
}