From c3c72a2711ed9d28dff842d6acdd4b79d32c963f Mon Sep 17 00:00:00 2001 From: OPNA2608 Date: Fri, 7 Mar 2025 16:56:04 +0100 Subject: [PATCH 1/2] Libervia-backend: Extract from old Libervia, add to new project structure --- projects/Libervia-backend/default.nix | 42 ++++ projects/Libervia-backend/examples/base.nix | 4 + projects/Libervia-backend/module.nix | 22 ++ projects/Libervia-backend/test.nix | 244 ++++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 projects/Libervia-backend/default.nix create mode 100644 projects/Libervia-backend/examples/base.nix create mode 100644 projects/Libervia-backend/module.nix create mode 100644 projects/Libervia-backend/test.nix diff --git a/projects/Libervia-backend/default.nix b/projects/Libervia-backend/default.nix new file mode 100644 index 000000000..170196bbd --- /dev/null +++ b/projects/Libervia-backend/default.nix @@ -0,0 +1,42 @@ +{ + lib, + pkgs, + sources, +}@args: +{ + metadata = { + summary = '' + Libervia is a multi-frontend, multi-purpose XMPP client. It doesn't just + focus on instant messaging, and uses the open standard to provide features + such as blogging/microblogging, calendar events, file sharing, end-to-end + encryption, etc. + ''; + subgrants = [ + "Libervia" + ]; + }; + nixos = { + modules.programs.libervia = { + links = { + config = { + text = "libervia.conf file reference"; + url = "https://libervia.org/__b/doc/backend/configuration.html"; + }; + backend = { + text = "Documentation on how to manually start the backend"; + url = "https://libervia.org/__b/doc/backend/installation.html#usage"; + }; + cli = { + text = "Command-line interface documentation"; + url = "https://libervia.org/__b/doc/backend/libervia-cli/index.html"; + }; + }; + module = ./module.nix; + examples.base = { + description = "Enables manually starting Libervia's backend and the use of its CLI and TUI clients."; + module = ./examples/base.nix; + tests.libervia-backend = import ./test.nix args; + }; + }; + }; +} diff --git a/projects/Libervia-backend/examples/base.nix b/projects/Libervia-backend/examples/base.nix new file mode 100644 index 000000000..3eb969d40 --- /dev/null +++ b/projects/Libervia-backend/examples/base.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.libervia.enable = true; +} diff --git a/projects/Libervia-backend/module.nix b/projects/Libervia-backend/module.nix new file mode 100644 index 000000000..f2e45fe30 --- /dev/null +++ b/projects/Libervia-backend/module.nix @@ -0,0 +1,22 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.libervia; +in +{ + options.programs.libervia = { + enable = lib.mkEnableOption "Libervia backend and CLI/TUI clients"; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + libervia-backend + ]; + + services.dbus.packages = with pkgs; [ libervia-backend ]; + }; +} diff --git a/projects/Libervia-backend/test.nix b/projects/Libervia-backend/test.nix new file mode 100644 index 000000000..0861eb38f --- /dev/null +++ b/projects/Libervia-backend/test.nix @@ -0,0 +1,244 @@ +{ + sources, + lib, + pkgs, + ... +}: +let + xmppUser = "alice"; + xmppId = "${xmppUser}@example.org"; + xmppPassword = "foobar"; + xmppMessage = "This is a test message."; + setup-initial-libervia-user = pkgs.writeShellApplication { + name = "setup-initial-libervia-user"; + runtimeInputs = with pkgs; [ prosody ]; + text = '' + exec prosodyctl adduser ${xmppId} </nixos/tests/custom-ca.nix + certs = + let + caName = "Libervia CA"; + domain = "example.org"; + in + pkgs.runCommand "example-cert" { buildInputs = [ pkgs.gnutls ]; } '' + mkdir $out + + # CA cert template + cat >ca.template <server.template <&2 &") + machine.succeed("sudo -su alice touch /home/alice/frontend.log") + machine.succeed("sudo -su alice tail -f /home/alice/frontend.log >&2 &") + machine.succeed("sudo -su alice touch /home/alice/desktop.log") + machine.succeed("sudo -su alice tail -f /home/alice/desktop.log >&2 &") + + with subtest("libervia-backend works"): + # Start libervia backend in foreground, so we can read logs + spawn_terminal() + machine.send_chars("libervia-backend fg | tee -a ~/backend.log\n") + machine.wait_for_console_text("Backend is ready") + + next_workspace() + + with subtest("libervia CLI works"): + # Register profile with setup XMPP account in Libervia + spawn_terminal() + machine.send_chars("libervia-cli profile create -j ${xmppId} -x ${xmppPassword} alice | tee -a ~/frontend.log\n") + machine.wait_for_console_text(r"\[${xmppUser}\] Profile session started") + + # Log in + machine.send_chars("libervia-cli profile connect -p alice -c | tee -a ~/frontend.log\n") + machine.wait_for_console_text("Data consistency ensured/restored.") + + # Send something + machine.send_chars("libervia-cli message send ${xmppId} ${xmppMessage}") # first log, us sending the message to ourself + machine.wait_for_console_text("${xmppUser}> ${xmppMessage}") # second log, us receicing the message from ourself + ''; +} From 9d52a8cb347b35948ffa09a6e95804a2411cb5d3 Mon Sep 17 00:00:00 2001 From: OPNA2608 Date: Tue, 11 Mar 2025 18:30:06 +0100 Subject: [PATCH 2/2] Libervia: Rename from Libervia-backend, migrate desktop parts as well, drop old project --- projects-old/Libervia/default.nix | 37 --- projects-old/Libervia/example.org.cnf | 35 --- projects-old/Libervia/examples/base.nix | 4 - projects-old/Libervia/module.nix | 23 -- projects-old/Libervia/test.nix | 270 ------------------ projects/Libervia-backend/examples/base.nix | 4 - projects/Libervia-backend/module.nix | 22 -- .../default.nix | 19 +- projects/Libervia/examples/backend.nix | 4 + projects/Libervia/examples/desktop.nix | 4 + projects/Libervia/module.nix | 36 +++ .../test.nix => Libervia/tests/backend.nix} | 4 +- projects/Libervia/tests/desktop.nix | 68 +++++ 13 files changed, 130 insertions(+), 400 deletions(-) delete mode 100644 projects-old/Libervia/default.nix delete mode 100644 projects-old/Libervia/example.org.cnf delete mode 100644 projects-old/Libervia/examples/base.nix delete mode 100644 projects-old/Libervia/module.nix delete mode 100644 projects-old/Libervia/test.nix delete mode 100644 projects/Libervia-backend/examples/base.nix delete mode 100644 projects/Libervia-backend/module.nix rename projects/{Libervia-backend => Libervia}/default.nix (61%) create mode 100644 projects/Libervia/examples/backend.nix create mode 100644 projects/Libervia/examples/desktop.nix create mode 100644 projects/Libervia/module.nix rename projects/{Libervia-backend/test.nix => Libervia/tests/backend.nix} (99%) create mode 100644 projects/Libervia/tests/desktop.nix diff --git a/projects-old/Libervia/default.nix b/projects-old/Libervia/default.nix deleted file mode 100644 index 84cf14f93..000000000 --- a/projects-old/Libervia/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - pkgs, - lib, - sources, -}@args: -{ - packages = { - inherit (pkgs) - doubleratchet - libervia-backend - libervia-desktop-kivy - libervia-media - libervia-templates - libxeddsa - oldmemo - omemo - sat-tmp - twomemo - urwid-satext - x3dh - xeddsa - ; - inherit (pkgs.python3Packages) - kivy-garden-modernmenu - ; - }; - nixos = { - modules.programs.libervia = ./module.nix; - tests.libervia = import ./test.nix args; - examples = { - base = { - description = "Enables the use of Libervia's CLI, TUI and GUI (kivy) clients."; - path = ./examples/base.nix; - }; - }; - }; -} diff --git a/projects-old/Libervia/example.org.cnf b/projects-old/Libervia/example.org.cnf deleted file mode 100644 index 31d8bda9c..000000000 --- a/projects-old/Libervia/example.org.cnf +++ /dev/null @@ -1,35 +0,0 @@ -[subject_alternative_name] -DNS.0 = upload.example.org -DNS.1 = conference.example.org -DNS.2 = example.org -otherName.0 = 1.3.6.1.5.5.7.8.7;IA5STRING:_xmpp-server.upload.example.org -otherName.1 = 1.3.6.1.5.5.7.8.5;FORMAT:UTF8,UTF8:upload.example.org -otherName.2 = 1.3.6.1.5.5.7.8.7;IA5STRING:_xmpp-server.conference.example.org -otherName.3 = 1.3.6.1.5.5.7.8.5;FORMAT:UTF8,UTF8:conference.example.org -otherName.4 = 1.3.6.1.5.5.7.8.7;IA5STRING:_xmpp-client.example.org -otherName.5 = 1.3.6.1.5.5.7.8.7;IA5STRING:_xmpp-server.example.org -otherName.6 = 1.3.6.1.5.5.7.8.5;FORMAT:UTF8,UTF8:example.org - -[selfsigned] -basicConstraints = CA:TRUE -subjectAltName = @subject_alternative_name - -[req] -prompt = no -req_extensions = certrequest -x509_extensions = selfsigned -distinguished_name = distinguished_name - -[certrequest] -extendedKeyUsage = serverAuth,clientAuth -subjectAltName = @subject_alternative_name -basicConstraints = CA:FALSE -keyUsage = digitalSignature,keyEncipherment - -[distinguished_name] -countryName = GB -localityName = The Internet -organizationName = Your Organisation -organizationalUnitName = XMPP Department -commonName = example.org -emailAddress = xmpp@example.org diff --git a/projects-old/Libervia/examples/base.nix b/projects-old/Libervia/examples/base.nix deleted file mode 100644 index 3eb969d40..000000000 --- a/projects-old/Libervia/examples/base.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ ... }: -{ - programs.libervia.enable = true; -} diff --git a/projects-old/Libervia/module.nix b/projects-old/Libervia/module.nix deleted file mode 100644 index 32e72edc3..000000000 --- a/projects-old/Libervia/module.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -let - cfg = config.programs.libervia; -in -{ - options.programs.libervia = { - enable = lib.mkEnableOption "Libervia"; - }; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - libervia-backend - libervia-desktop-kivy - ]; - - services.dbus.packages = with pkgs; [ libervia-backend ]; - }; -} diff --git a/projects-old/Libervia/test.nix b/projects-old/Libervia/test.nix deleted file mode 100644 index 1d1e1e507..000000000 --- a/projects-old/Libervia/test.nix +++ /dev/null @@ -1,270 +0,0 @@ -{ - sources, - lib, - pkgs, - ... -}: -let - xmppUser = "alice"; - xmppId = "${xmppUser}@example.org"; - xmppPassword = "foobar"; - xmppMessage = "This is a test message."; - setup-initial-libervia-user = pkgs.writeShellApplication { - name = "setup-initial-libervia-user"; - runtimeInputs = with pkgs; [ prosody ]; - text = '' - exec prosodyctl adduser ${xmppId} </nixos/tests/custom-ca.nix - certs = - let - caName = "Libervia CA"; - domain = "example.org"; - in - pkgs.runCommand "example-cert" { buildInputs = [ pkgs.gnutls ]; } '' - mkdir $out - - # CA cert template - cat >ca.template <server.template <&2 &") - machine.succeed("sudo -su alice touch /home/alice/frontend.log") - machine.succeed("sudo -su alice tail -f /home/alice/frontend.log >&2 &") - machine.succeed("sudo -su alice touch /home/alice/desktop.log") - machine.succeed("sudo -su alice tail -f /home/alice/desktop.log >&2 &") - - with subtest("libervia-backend works"): - # Start libervia backend in foreground, so we can read logs - spawn_terminal() - machine.send_chars("libervia-backend fg | tee -a ~/backend.log\n") - machine.wait_for_console_text("Backend is ready") - - next_workspace() - - with subtest("libervia CLI works"): - # Register profile with setup XMPP account in Libervia - spawn_terminal() - machine.send_chars("libervia-cli profile create -j ${xmppId} -x ${xmppPassword} alice | tee -a ~/frontend.log\n") - machine.wait_for_console_text(r"\[${xmppUser}\] Profile session started") - - # Log in - machine.send_chars("libervia-cli profile connect -p alice -c | tee -a ~/frontend.log\n") - machine.wait_for_console_text("Data consistency ensured/restored.") - - # Send something - machine.send_chars("libervia-cli message send ${xmppId} ${xmppMessage}") # first log, us sending the message to ourself - machine.wait_for_console_text("${xmppUser}> ${xmppMessage}") # second log, us receicing the message from ourself - - next_workspace() - - with subtest("libervia-desktop-kivy works"): - # Start it - spawn_terminal() - machine.send_chars("libervia-desktop-kivy 2>&1 | tee -a ~/desktop.log\n") - machine.wait_for_text("Select a profile") - machine.send_key("alt-f10") - - # Log in as alice - machine.succeed("sudo -su alice xdotool mousemove 518 163 click 1") - machine.sleep(2) - machine.succeed("sudo -su alice xdotool mousemove 509 721 click 1") - machine.wait_for_text("chat") - - # Enter chat - machine.succeed("sudo -su alice xdotool mousemove 493 199 click 1") - machine.wait_for_text("Your contacts") - - # Open conversation with ourselves - machine.succeed("sudo -su alice xdotool mousemove 80 148 click 1") - machine.wait_for_text("${xmppMessage}") - ''; -} diff --git a/projects/Libervia-backend/examples/base.nix b/projects/Libervia-backend/examples/base.nix deleted file mode 100644 index 3eb969d40..000000000 --- a/projects/Libervia-backend/examples/base.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ ... }: -{ - programs.libervia.enable = true; -} diff --git a/projects/Libervia-backend/module.nix b/projects/Libervia-backend/module.nix deleted file mode 100644 index f2e45fe30..000000000 --- a/projects/Libervia-backend/module.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -let - cfg = config.programs.libervia; -in -{ - options.programs.libervia = { - enable = lib.mkEnableOption "Libervia backend and CLI/TUI clients"; - }; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - libervia-backend - ]; - - services.dbus.packages = with pkgs; [ libervia-backend ]; - }; -} diff --git a/projects/Libervia-backend/default.nix b/projects/Libervia/default.nix similarity index 61% rename from projects/Libervia-backend/default.nix rename to projects/Libervia/default.nix index 170196bbd..5aa9fe272 100644 --- a/projects/Libervia-backend/default.nix +++ b/projects/Libervia/default.nix @@ -30,12 +30,23 @@ text = "Command-line interface documentation"; url = "https://libervia.org/__b/doc/backend/libervia-cli/index.html"; }; + kivy = { + text = "Kivy desktop client documentation"; + url = "https://libervia.org/documentation/desktop-mobile"; + }; }; module = ./module.nix; - examples.base = { - description = "Enables manually starting Libervia's backend and the use of its CLI and TUI clients."; - module = ./examples/base.nix; - tests.libervia-backend = import ./test.nix args; + examples = { + backend = { + description = "Enables manually starting Libervia's backend and the use of its CLI and TUI clients."; + module = ./examples/backend.nix; + tests.backend = import ./tests/backend.nix args; + }; + desktop = { + description = "Enables the use of the Kivy desktop client for Libervia."; + module = ./examples/desktop.nix; + tests.desktop = import ./tests/desktop.nix args; + }; }; }; }; diff --git a/projects/Libervia/examples/backend.nix b/projects/Libervia/examples/backend.nix new file mode 100644 index 000000000..967d7615d --- /dev/null +++ b/projects/Libervia/examples/backend.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.libervia.backend.enable = true; +} diff --git a/projects/Libervia/examples/desktop.nix b/projects/Libervia/examples/desktop.nix new file mode 100644 index 000000000..3f2c5c189 --- /dev/null +++ b/projects/Libervia/examples/desktop.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.libervia.kivy.enable = true; +} diff --git a/projects/Libervia/module.nix b/projects/Libervia/module.nix new file mode 100644 index 000000000..806b7f3f0 --- /dev/null +++ b/projects/Libervia/module.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.libervia; +in +{ + options.programs.libervia = { + backend.enable = lib.mkEnableOption "Libervia backend and CLI/TUI clients"; + kivy.enable = lib.mkEnableOption "Libervia Kivy desktop client"; + }; + + config = lib.mkMerge [ + # Backend + (lib.mkIf cfg.backend.enable { + environment.systemPackages = with pkgs; [ + libervia-backend + ]; + + services.dbus.packages = with pkgs; [ libervia-backend ]; + }) + + # Kivy client + (lib.mkIf cfg.kivy.enable { + # Also needs the backend + programs.libervia.backend.enable = true; + + environment.systemPackages = with pkgs; [ + libervia-desktop-kivy + ]; + }) + ]; +} diff --git a/projects/Libervia-backend/test.nix b/projects/Libervia/tests/backend.nix similarity index 99% rename from projects/Libervia-backend/test.nix rename to projects/Libervia/tests/backend.nix index 0861eb38f..4667b3238 100644 --- a/projects/Libervia-backend/test.nix +++ b/projects/Libervia/tests/backend.nix @@ -23,6 +23,8 @@ in { name = "Libervia-backend"; + passthru.xmppMessage = xmppMessage; + nodes = { server = { @@ -94,7 +96,7 @@ in imports = [ sources.modules.ngipkgs sources.modules.programs.libervia - sources.examples.Libervia-backend.base + sources.examples.Libervia.backend ]; # Need an actual logged-in user to test with diff --git a/projects/Libervia/tests/desktop.nix b/projects/Libervia/tests/desktop.nix new file mode 100644 index 000000000..cfd7a9e20 --- /dev/null +++ b/projects/Libervia/tests/desktop.nix @@ -0,0 +1,68 @@ +{ + sources, + lib, + pkgs, + ... +}@args: + +# We need all the same setup as the libervia-backend test, so just extend that one with desktop things +let + backendTest = import ./backend.nix args; +in +backendTest +// { + name = "Libervia-desktop-kivy"; + + nodes.server = + { + config, + lib, + pkgs, + ... + }@args2: + let + backendTestConfig = backendTest.nodes.server args2; + in + backendTestConfig + // { + imports = backendTestConfig.imports ++ [ + sources.examples.Libervia.desktop + ]; + + environment = backendTestConfig.environment // { + systemPackages = + backendTestConfig.environment.systemPackages + ++ (with pkgs; [ + xdotool # Control the mouse + ]); + }; + }; + + testScript = + { nodes, ... }@args3: + (backendTest.testScript args3) + + '' + next_workspace() + + with subtest("libervia-desktop-kivy works"): + # Start it + spawn_terminal() + machine.send_chars("libervia-desktop-kivy 2>&1 | tee -a ~/desktop.log\n") + machine.wait_for_text("Select a profile") + machine.send_key("alt-f10") + + # Log in as alice + machine.succeed("sudo -su alice xdotool mousemove 518 163 click 1") + machine.sleep(2) + machine.succeed("sudo -su alice xdotool mousemove 509 721 click 1") + machine.wait_for_text("chat") + + # Enter chat + machine.succeed("sudo -su alice xdotool mousemove 493 199 click 1") + machine.wait_for_text("Your contacts") + + # Open conversation with ourselves + machine.succeed("sudo -su alice xdotool mousemove 80 148 click 1") + machine.wait_for_text("${backendTest.passthru.xmppMessage}") + ''; +}