From f4be9039d276468caef06c78ddfdbeace6cbaaa7 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 13 May 2026 13:38:59 -0700 Subject: [PATCH 01/34] syncthing: Use systemd-sysusers for creating a system user account - Drop dependency on 'adduser' package. Tests: - Functional tests for syncthing work. - Installing syncthing app works. The system user and group are created with proper UID/GID, shell, gecos, and home directory. Signed-off-by: Sunil Mohan Adapa --- .../lib/sysusers.d/freedombox-syncthing.conf | 6 ++++++ plinth/modules/syncthing/privileged.py | 19 ++----------------- 2 files changed, 8 insertions(+), 17 deletions(-) create mode 100644 plinth/modules/syncthing/data/usr/lib/sysusers.d/freedombox-syncthing.conf diff --git a/plinth/modules/syncthing/data/usr/lib/sysusers.d/freedombox-syncthing.conf b/plinth/modules/syncthing/data/usr/lib/sysusers.d/freedombox-syncthing.conf new file mode 100644 index 000000000..a645f23b5 --- /dev/null +++ b/plinth/modules/syncthing/data/usr/lib/sysusers.d/freedombox-syncthing.conf @@ -0,0 +1,6 @@ +# Create system user and group to run syncthing as system daemon (as opposed to +# running in particular user's account). The user is created at boot or when +# 'systemd-sysusers freedombox-syncthing.conf' is run. To override this file as +# system administrator, create a file /etc/sysusers.d/freedombox-syncthing.conf +# or link it to /dev/null. +u! syncthing - "Syncthing file synchronization server" /var/lib/syncthing diff --git a/plinth/modules/syncthing/privileged.py b/plinth/modules/syncthing/privileged.py index 5359a09d6..0fa6bbd67 100644 --- a/plinth/modules/syncthing/privileged.py +++ b/plinth/modules/syncthing/privileged.py @@ -1,9 +1,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Configure Syncthing.""" -import grp import os -import pwd import shutil import time @@ -32,21 +30,8 @@ def augeas_load(conf_file): @privileged def setup(): """Perform post-install actions for Syncthing.""" - # Create syncthing group if needed. - try: - grp.getgrnam('syncthing') - except KeyError: - action_utils.run(['addgroup', '--system', 'syncthing'], check=True) - - # Create syncthing user if needed. - try: - pwd.getpwnam('syncthing') - except KeyError: - action_utils.run([ - 'adduser', '--system', '--ingroup', 'syncthing', '--home', - DATA_DIR, '--gecos', 'Syncthing file synchronization server', - 'syncthing' - ], check=True) + # Create a 'syncthing' system user and group, if needed. + action_utils.run(['systemd-sysusers', 'freedombox-syncthing.conf']) if not os.path.exists(DATA_DIR): os.makedirs(DATA_DIR, mode=0o750) From e48ff1afbc3183bfda142e84113868baac9562bf Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 13 May 2026 13:44:32 -0700 Subject: [PATCH 02/34] infinoted: Use systemd-sysusers for creating a system user account - Drop dependency on 'adduser' package. Tests: - Functional tests for infinoted work. - Installing infinoted app works. The system user and group are created with proper UID/GID, shell, gecos, and home directory. Signed-off-by: Sunil Mohan Adapa --- .../lib/sysusers.d/freedombox-infinoted.conf | 6 ++++++ plinth/modules/infinoted/privileged.py | 19 ++----------------- 2 files changed, 8 insertions(+), 17 deletions(-) create mode 100644 plinth/modules/infinoted/data/usr/lib/sysusers.d/freedombox-infinoted.conf diff --git a/plinth/modules/infinoted/data/usr/lib/sysusers.d/freedombox-infinoted.conf b/plinth/modules/infinoted/data/usr/lib/sysusers.d/freedombox-infinoted.conf new file mode 100644 index 000000000..31bc1d08c --- /dev/null +++ b/plinth/modules/infinoted/data/usr/lib/sysusers.d/freedombox-infinoted.conf @@ -0,0 +1,6 @@ +# Create system user and group to run infinoted as system daemon (as opposed to +# running in particular user's account). The user is created at boot or when +# 'systemd-sysusers freedombox-infinoted.conf' is run. To override this file as +# system administrator, create a file /etc/sysusers.d/freedombox-infinoted.conf +# or link it to /dev/null. +u! infinoted - "Infinoted collaborative editing server" /var/lib/infinoted diff --git a/plinth/modules/infinoted/privileged.py b/plinth/modules/infinoted/privileged.py index 80bf1e275..e65d49c10 100644 --- a/plinth/modules/infinoted/privileged.py +++ b/plinth/modules/infinoted/privileged.py @@ -1,10 +1,8 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Configure infinoted.""" -import grp import os import pathlib -import pwd import shutil import subprocess import time @@ -126,21 +124,8 @@ def setup(): action_utils.service_daemon_reload() - # Create infinoted group if needed. - try: - grp.getgrnam('infinoted') - except KeyError: - action_utils.run(['addgroup', '--system', 'infinoted'], check=True) - - # Create infinoted user if needed. - try: - pwd.getpwnam('infinoted') - except KeyError: - action_utils.run([ - 'adduser', '--system', '--ingroup', 'infinoted', '--home', - DATA_DIR, '--gecos', 'Infinoted collaborative editing server', - 'infinoted' - ], check=True) + # Create an 'infinoted' system user and group, if needed. + action_utils.run(['systemd-sysusers', 'freedombox-infinoted.conf']) for directory in (DATA_DIR, KEY_DIR, SYNC_DIR): if not os.path.exists(directory): From 529bbf77df9194d73ce888972db44a0377eeafc8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 13 May 2026 13:36:25 -0700 Subject: [PATCH 03/34] bepasty: Don't remove old system user and group As removing a system user and group is considered a bad practice. Old unused system accounts are mostly harmless. Tests: - Bepasty functional tests pass. - Installing bepasty and uploading a file works. Signed-off-by: Sunil Mohan Adapa --- plinth/modules/bepasty/privileged.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plinth/modules/bepasty/privileged.py b/plinth/modules/bepasty/privileged.py index 80bdcb439..b89833e6a 100644 --- a/plinth/modules/bepasty/privileged.py +++ b/plinth/modules/bepasty/privileged.py @@ -91,8 +91,6 @@ def setup(domain_name: str): # Migrate from old bepasty:bepasty ownership to root:root shutil.chown(CONF_FILE, user='root', group='root') - action_utils.run(['deluser', 'bepasty'], check=False) - action_utils.run(['delgroup', 'bepasty'], check=False) @privileged @@ -151,6 +149,6 @@ def _generate_password(): @privileged def uninstall(): - """Remove bepasty user, group and data.""" + """Remove data and configuration file.""" shutil.rmtree(DATA_DIR, ignore_errors=True) CONF_FILE.unlink(missing_ok=True) From a4b3d53141c934ab847f07c4fd6d5b4082d92690 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 7 May 2026 22:23:40 +0100 Subject: [PATCH 04/34] Stop deleting system user on remove/purge This is widely considered bad practice, as the kernel recycles UIDs/GIDs. So any potential leftover file/directory can then become owned by the next user/group that gets added, with unpredictable consequences. --- debian/freedombox.postrm | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/freedombox.postrm b/debian/freedombox.postrm index 244f5736e..6e535c19e 100755 --- a/debian/freedombox.postrm +++ b/debian/freedombox.postrm @@ -4,7 +4,6 @@ set -e case "$1" in purge) - deluser --system --quiet plinth || true rm -rf /var/lib/plinth # Remove legacy directory too From 9abe624265d1ede86c2bd38be544405ee9be0d5b Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 7 May 2026 22:24:42 +0100 Subject: [PATCH 05/34] Install and use sysusers.d/tmpfiles.d config files sysusers.d/tmpfiles.d config files allow a package to use declarative configuration instead of manually written maintainer scripts. This also allows image-based systems to be created with /usr/ only, and also allows for factory resetting a system and recreating /etc/ on boot. https://www.freedesktop.org/software/systemd/man/latest/sysusers.d.html https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html Tests: - /var/lib/plinth and /var/lib/plinth/sessions/ are created on package install. Ownership is plinth:plinth. 0755 is permissions. - /var/lib/plinth/firstboot-wizard-secret file is created on package install. Ownership is plinth:plinth. 0400 is permissions. During first wizard, providing the secret works. - /var/lib/plinth/backups-data is owned by root:root. - When upgrading from old package to new the permissions don't change. - When reinstalling the new package, the permissions do not change. - User is created same as before. plinth:x:987:987:FreedomBox service:/var/lib/plinth:/usr/sbin/nologin - Group is created same as before. plinth:x:987: - id plinth uid=987(plinth) gid=987(plinth) groups=987(plinth) - Upgrading from old package to new does not change user and group records. - Reinstalling new version does not change user and group records. [sunil: Don't recursively change ownership for /var/lib/plinth/] [sunil: Change ownership specifically for /var/lib/plinth/firstboot-wizard-secret] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa Tested-by: Sunil Mohan Adapa --- debian/control | 2 +- debian/freedombox.postinst | 12 ------------ debian/freedombox.sysusers | 1 + debian/freedombox.tmpfiles | 3 +++ 4 files changed, 5 insertions(+), 13 deletions(-) create mode 100644 debian/freedombox.sysusers create mode 100644 debian/freedombox.tmpfiles diff --git a/debian/control b/debian/control index d130d3bf2..21d662fa0 100644 --- a/debian/control +++ b/debian/control @@ -11,6 +11,7 @@ Uploaders: James Valleroy , Build-Depends: debhelper-compat (= 13), + dh-sequence-installsysusers, dblatex, dh-python, docbook-xsl, @@ -74,7 +75,6 @@ Depends: ${python3:Depends}, ${misc:Depends}, ${freedombox:Depends}, - adduser, augeas-tools, bind9-dnsutils, curl, diff --git a/debian/freedombox.postinst b/debian/freedombox.postinst index c824606f7..ff6bc2a58 100755 --- a/debian/freedombox.postinst +++ b/debian/freedombox.postinst @@ -13,21 +13,9 @@ sed -i 's+-:ALL EXCEPT root fbx (admin) (sudo):ALL+-:ALL EXCEPT root fbx plinth case "$1" in configure) - if ! getent group plinth >/dev/null; then - addgroup --system --quiet plinth - fi - - if ! getent passwd plinth >/dev/null; then - adduser --system --quiet --ingroup plinth --no-create-home --home /var/lib/plinth plinth - fi - - chown plinth: /var/lib/plinth - chown plinth: /var/lib/plinth/sessions - if [ ! -e '/var/lib/freedombox/is-freedombox-disk-image' ]; then umask 377 base64 < /dev/urandom | head -c 16 | sed -e 's+$+\n+' > /var/lib/plinth/firstboot-wizard-secret - chown plinth:plinth /var/lib/plinth/firstboot-wizard-secret db_subst plinth/firstboot_wizard_secret secret $(cat /var/lib/plinth/firstboot-wizard-secret) db_input high plinth/firstboot_wizard_secret || true db_go diff --git a/debian/freedombox.sysusers b/debian/freedombox.sysusers new file mode 100644 index 000000000..d79adecfc --- /dev/null +++ b/debian/freedombox.sysusers @@ -0,0 +1 @@ +u! plinth - "FreedomBox service" /var/lib/plinth diff --git a/debian/freedombox.tmpfiles b/debian/freedombox.tmpfiles new file mode 100644 index 000000000..6a93eb87c --- /dev/null +++ b/debian/freedombox.tmpfiles @@ -0,0 +1,3 @@ +d /var/lib/plinth 0755 plinth plinth +d /var/lib/plinth/sessions 0755 plinth plinth +Z /var/lib/plinth/firstboot-wizard-secret 0400 plinth plinth From 511de5e106ff10720b4ce8c4deefea05f98cebd4 Mon Sep 17 00:00:00 2001 From: Hosted Weblate user 151773 Date: Wed, 20 May 2026 20:05:27 +0200 Subject: [PATCH 06/34] Translated using Weblate (German) Currently translated at 99.3% (1916 of 1929 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 43ad1bef1..78b5e439c 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-04-28 22:01+0000\n" -"PO-Revision-Date: 2026-05-05 17:11+0000\n" -"Last-Translator: Dietmar \n" +"PO-Revision-Date: 2026-05-21 18:11+0000\n" +"Last-Translator: Hosted Weblate user 151773 \n" "Language-Team: German \n" "Language: de\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.17.1\n" +"X-Generator: Weblate 2026.6.dev0\n" #: plinth/config.py:103 #, python-brace-format @@ -3810,7 +3810,7 @@ msgstr "Heimautomatisierung" #: plinth/modules/homeassistant/manifest.py:63 msgid "IoT" -msgstr "" +msgstr "IdD" #: plinth/modules/homeassistant/manifest.py:64 #: plinth/modules/networks/manifest.py:8 @@ -6722,7 +6722,7 @@ msgstr "" #: plinth/modules/oidc/__init__.py:56 msgid "OpenID Connect Provider" -msgstr "" +msgstr "OpenID Verbindungsanbieter" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:14 msgid "Application" From 3d96f41053568fb78b0113980530940360d1ee25 Mon Sep 17 00:00:00 2001 From: jay Date: Wed, 20 May 2026 22:25:53 +0200 Subject: [PATCH 07/34] Translated using Weblate (Dutch) Currently translated at 93.9% (1813 of 1929 strings) --- plinth/locale/nl/LC_MESSAGES/django.po | 48 ++++++++------------------ 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index b28a14496..e441744e1 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-04-28 22:01+0000\n" -"PO-Revision-Date: 2025-09-17 09:01+0000\n" -"Last-Translator: ikmaak \n" +"PO-Revision-Date: 2026-05-21 18:11+0000\n" +"Last-Translator: jay \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.14-dev\n" +"X-Generator: Weblate 2026.6.dev0\n" "X-Language: nl_NL\n" "X-Source-Language: C\n" @@ -412,10 +412,8 @@ msgid "Passphrase" msgstr "Wachtwoordzin" #: plinth/modules/backups/forms.py:187 -#, fuzzy -#| msgid "Passphrase; Only needed when using encryption." msgid "Only needed when using encryption." -msgstr "Wachtwoordzin; Alleen nodig bij het gebruik van versleuteling." +msgstr "Alleen nodig bij het gebruik van versleuteling." #: plinth/modules/backups/forms.py:190 msgid "Confirm Passphrase" @@ -482,10 +480,8 @@ msgid "SSH server password" msgstr "SSH-server wachtwoord" #: plinth/modules/backups/forms.py:262 -#, fuzzy -#| msgid "Disable password authentication" msgid "Required for password-based authentication." -msgstr "Wachtwoord authenticatie uitschakelen" +msgstr "Benodigd voor wachtwoord authenticatie." #: plinth/modules/backups/forms.py:275 #, fuzzy @@ -824,10 +820,9 @@ msgid "Authentication to remote server failed." msgstr "Authenticatie naar externe server is mislukt." #: plinth/modules/backups/views.py:50 -#, fuzzy -#| msgid "Error establishing connection to server: {}" msgid "Error establishing connection to server: {} {} {}" -msgstr "Fout bij het tot stand brengen van een verbinding met de server: {}" +msgstr "" +"Fout bij het tot stand brengen van een verbinding met de server: {} {} {}" #: plinth/modules/backups/views.py:82 msgid "Backup schedule updated." @@ -1470,14 +1465,7 @@ msgid "Webserver Home Page" msgstr "Startpagina van de webserver" #: plinth/modules/config/forms.py:37 -#, fuzzy, python-brace-format -#| msgid "" -#| "Choose the default page that must be served when someone visits your " -#| "{box_name} on the web. A typical use case is to set your blog or wiki as " -#| "the home page when someone visits the domain name. Note that once the " -#| "home page is set to something other than {box_name} Service (Plinth), " -#| "your users must explicitly type /plinth or /freedombox to reach " -#| "{box_name} Service (Plinth)." +#, python-brace-format msgid "" "Choose the default page that must be served when someone visits your " "{box_name} on the web. A typical use case is to set your blog or wiki as the " @@ -1489,8 +1477,8 @@ msgstr "" "{box_name} op internet bezoekt. Vaak wordt het blog of wiki ingesteld als de " "startpagina wanneer iemand de domeinnaam bezoekt. Merk op dat zodra de " "startpagina is ingesteld op iets anders dan {box_name} service (Plinth), " -"gebruikers expliciet /plinth of /freedombox moeten typen om de {box_name} " -"service (Plinth) te bereiken." +"gebruikers expliciet /freedombox moeten typen om de {box_name} service " +"(Plinth) te bereiken." #: plinth/modules/config/forms.py:48 msgid "Show advanced apps and features" @@ -2446,16 +2434,12 @@ msgstr "" "automatisch aangemaakt en wijzen naar de eerste admin gebruiker." #: plinth/modules/email/__init__.py:41 -#, fuzzy -#| msgid "" -#| "Roundcube app provides web " -#| "interface for users to access email." msgid "" "Roundcube app provides web " "interface for users to access email." msgstr "" -"Roundcube app biedt gebruikers een " -"webinterface om toegang te krijgen tot e-mail." +"Roundcube app biedt gebruikers " +"een webinterface om toegang te krijgen tot e-mail." #: plinth/modules/email/__init__.py:43 msgid "" @@ -9771,10 +9755,8 @@ msgstr "" #: plinth/modules/users/templates/users_login.html:41 #: plinth/modules/users/templates/users_passkeys.html:41 -#, fuzzy -#| msgid "This app does not support diagnostics" msgid "Browser does not support passkeys." -msgstr "Deze toepassing heeft geen diagnosetests" +msgstr "De browser ondersteunt geen passkeys." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9834,10 +9816,8 @@ msgid "Added" msgstr "" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Laatst gescand: " +msgstr "Laatst gebruikt" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." From 5fe11cedb6be546df778169be99c8809b9d8b818 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Fri, 13 Mar 2026 11:47:21 +0000 Subject: [PATCH 08/34] wireguard: add wrapper function that generates client key pair Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/utils.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plinth/modules/wireguard/utils.py b/plinth/modules/wireguard/utils.py index 5b7d9821f..cdcc19268 100644 --- a/plinth/modules/wireguard/utils.py +++ b/plinth/modules/wireguard/utils.py @@ -160,6 +160,13 @@ def _generate_private_key(): return process.stdout.decode().strip() +def generate_client_keypair(): + """Generate client private/public keypair.""" + private_key = _generate_private_key() + public_key = _get_public_key_from_private_key(private_key) + return private_key, public_key + + def _find_next_interface(): """Find next unused wireguard interface name.""" output = subprocess.check_output(['wg', 'show', From 36e1dd9e7419dfbad83c2280c0f628a4d288ff69 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 12:03:22 +0000 Subject: [PATCH 09/34] wireguard: Create AutoAddClientView Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/views.py | 67 +++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/plinth/modules/wireguard/views.py b/plinth/modules/wireguard/views.py index e561bd245..97d4bba00 100644 --- a/plinth/modules/wireguard/views.py +++ b/plinth/modules/wireguard/views.py @@ -82,6 +82,73 @@ class AddClientView(SuccessMessageMixin, FormView): return super().form_valid(form) +class AutoAddClientView(SuccessMessageMixin, FormView): + """View to add a client with keypair generation.""" + form_class = forms.AutoAddClientForm + template_name = 'wireguard_auto_add_client.html' + success_url = reverse_lazy('wireguard:index') + success_message = _('Added new client.') + + def get_context_data(self, **kwargs): + """Return additional context for rendering the template.""" + context = super().get_context_data(**kwargs) + context['title'] = _('Add Allowed Client') + + context['domains'] = [] + info = utils.get_info() + server_info = info['my_server'] + + if server_info: + domains = DomainName.list_names(filter_for_service='wireguard') + filtered_domains = [ + domain for domain in domains if not domain.endswith('.local') + ] + port = server_info.get('listen_port', 51820) + endpoint = f"{filtered_domains[0]}:{port}" + + try: + client_privkey, client_pubkey = utils.generate_client_keypair() + + # Get next IP + connection = utils._server_connection() + setting_name = utils.nm.SETTING_WIREGUARD_SETTING_NAME + settings = connection.get_setting_by_name(setting_name) + next_ip = utils._get_next_available_ip_address(settings) + + # Add properties to template context + context.update({ + 'domains': filtered_domains, + 'next_ip': next_ip, + 'client_privkey': client_privkey, + 'client_pubkey': client_pubkey, + 'endpoint': endpoint + }) + + # Store pubkey on instance for form_valid() + self.request.session['client_pubkey'] = client_pubkey + + except Exception as e: + messages.warning(f"Client key generation failed: {e}") + pass + + return context + + def form_valid(self, form): + """Add client using generated public key.""" + try: + client_pubkey = self.request.session.pop('client_pubkey') + utils.add_client(client_pubkey) + except KeyError: + messages.warning(self.request, + _('Session expired. Please try again.')) + return redirect('wireguard:auto-add-client') + except ValueError: + messages.warning(self.request, _('Client already exists')) + return redirect('wireguard:index') + + return super().form_valid(form) + + class ShowClientView(SuccessMessageMixin, TemplateView): """View to show a client's details.""" template_name = 'wireguard_show_client.html' From 0a67183fe4c2a247ca206ce6be9ab44d83fd8a64 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 12:12:40 +0000 Subject: [PATCH 10/34] wireguard: Add URL for AutoAddClientView Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/urls.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plinth/modules/wireguard/urls.py b/plinth/modules/wireguard/urls.py index 1c44b551e..2f0e257fb 100644 --- a/plinth/modules/wireguard/urls.py +++ b/plinth/modules/wireguard/urls.py @@ -13,6 +13,8 @@ urlpatterns = [ views.EnableServerView.as_view(), name='enable-server'), re_path(r'^apps/wireguard/client/add/$', views.AddClientView.as_view(), name='add-client'), + re_path(r'^apps/wireguard/client/auto-add/$', + views.AutoAddClientView.as_view(), name='auto-add-client'), re_path(r'^apps/wireguard/client/(?P[^/]+)/show/$', views.ShowClientView.as_view(), name='show-client'), re_path(r'^apps/wireguard/client/(?P[^/]+)/edit/$', From ebac5e86a30689d4fd1f966ff1738a1bc9b7d5d5 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 12:42:59 +0000 Subject: [PATCH 11/34] wireguard: Add auto add client button Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/templates/wireguard.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plinth/modules/wireguard/templates/wireguard.html b/plinth/modules/wireguard/templates/wireguard.html index 95db00105..378b9b4d4 100644 --- a/plinth/modules/wireguard/templates/wireguard.html +++ b/plinth/modules/wireguard/templates/wireguard.html @@ -85,6 +85,11 @@
+ + {% trans "Add Client Automatically" %} + From 77a91fc35716aeb0d60c5a5cfae3965b916fa0c9 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 12:45:09 +0000 Subject: [PATCH 12/34] wireguard/theme: Add icon to auto add client button Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/templates/wireguard.html | 1 + static/themes/default/icons/magic.svg | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 static/themes/default/icons/magic.svg diff --git a/plinth/modules/wireguard/templates/wireguard.html b/plinth/modules/wireguard/templates/wireguard.html index 378b9b4d4..2b3f7b259 100644 --- a/plinth/modules/wireguard/templates/wireguard.html +++ b/plinth/modules/wireguard/templates/wireguard.html @@ -88,6 +88,7 @@ + {% icon 'magic' %} {% trans "Add Client Automatically" %} + + From 8cbcd39bb276a5420a0276921a5f54b631335e00 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 13:09:59 +0000 Subject: [PATCH 13/34] wireguard: Add empty form for AutoAddClientView Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/forms.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plinth/modules/wireguard/forms.py b/plinth/modules/wireguard/forms.py index cccc37ad8..9b4982bf7 100644 --- a/plinth/modules/wireguard/forms.py +++ b/plinth/modules/wireguard/forms.py @@ -74,6 +74,11 @@ class AddClientForm(forms.Form): validators=[validate_key]) +class AutoAddClientForm(forms.Form): + """Empty form for auto-client addition UX.""" + pass + + class AddServerForm(forms.Form): """Form to add server.""" peer_endpoint = forms.CharField( From 81e60dff0e132858cef2a5c43b13acd47ae7c401 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sat, 21 Mar 2026 15:03:55 +0000 Subject: [PATCH 14/34] wireguard: Add template to show generated client info Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- .../templates/wireguard_auto_add_client.html | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 plinth/modules/wireguard/templates/wireguard_auto_add_client.html diff --git a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html new file mode 100644 index 000000000..0cff47119 --- /dev/null +++ b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} +{% comment %} +# SPDX-License-Identifier: AGPL-3.0-or-later +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{{ title }}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + {% if client_privkey %} +
+ + + + + + +
{% trans "IP Address" %}{{ next_ip }}
{% trans "Endpoint" %}{{ endpoint }}
{% trans "Public Key" %}{{ client_pubkey }}
{% trans "Private Key" %} +
{% trans "Click to reveal" %} + {{ client_privkey }} +
+
+ +
+ {% trans "Important:" %} + {% trans "Save the private key now. This page shows it only once!" %} +
+ {% endif %} + +
+ +{% endblock %} From bb6729a99a1dba583794f03e3bbba152dbf45c5f Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 22 Mar 2026 13:03:14 +0000 Subject: [PATCH 15/34] wireguard: Create function for building conf files Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/utils.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plinth/modules/wireguard/utils.py b/plinth/modules/wireguard/utils.py index cdcc19268..7e632c0dd 100644 --- a/plinth/modules/wireguard/utils.py +++ b/plinth/modules/wireguard/utils.py @@ -310,3 +310,25 @@ def remove_client(public_key): settings.remove_peer(peer_index) connection.commit_changes(True) network.reactivate_connection(connection.get_uuid()) + + +def build_client_config(client_ip: str, client_privkey: str, + client_pubkey: str, endpoint: str) -> str: + """Generate WireGuard client config.""" + info = get_info() + server_info = info['my_server'] + if not server_info: + raise RuntimeError("WireGuard server not configured") + + server_pubkey = server_info['public_key'] + + return f"""[Interface] +PrivateKey = {client_privkey} +Address = {client_ip}/32 +DNS = 10.84.0.1 + +[Peer] +PublicKey = {server_pubkey} +AllowedIPs = 0.0.0.0/0 +Endpoint = {endpoint} +PersistentKeepalive = 25""" From 60a6ac2a0d5a6d4fca707f92eab2828fa0789245 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 22 Mar 2026 17:48:40 +0000 Subject: [PATCH 16/34] wireguard: Create mixin for reusing generated client conf Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/views.py | 44 ++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/plinth/modules/wireguard/views.py b/plinth/modules/wireguard/views.py index 97d4bba00..ef596e701 100644 --- a/plinth/modules/wireguard/views.py +++ b/plinth/modules/wireguard/views.py @@ -82,6 +82,36 @@ class AddClientView(SuccessMessageMixin, FormView): return super().form_valid(form) +class SessionClientDataMixin: + """Shared session data loading for auto-client views.""" + + def get_session_client_data(self, request): + """Extract client data from session.""" + next_ip = request.session.get('next_ip') + pubkey = request.session.get('client_pubkey') + privkey = request.session.get('client_privkey') + endpoint = request.session.get('endpoint') + + if not all([next_ip, privkey, pubkey, endpoint]): + raise Http404("Session expired") + + return { + 'next_ip': next_ip, + 'privkey': privkey, + 'pubkey': pubkey, + 'endpoint': endpoint + } + + def get_client_config(self, request): + """Rebuild client config from session.""" + data = self.get_session_client_data(request) + + return utils.build_client_config( + data['next_ip'], data['privkey'], + data['pubkey'], data['endpoint'] + ) + + class AutoAddClientView(SuccessMessageMixin, FormView): """View to add a client with keypair generation.""" form_class = forms.AutoAddClientForm @@ -115,17 +145,19 @@ class AutoAddClientView(SuccessMessageMixin, FormView): settings = connection.get_setting_by_name(setting_name) next_ip = utils._get_next_available_ip_address(settings) - # Add properties to template context - context.update({ - 'domains': filtered_domains, + data = { 'next_ip': next_ip, 'client_privkey': client_privkey, 'client_pubkey': client_pubkey, 'endpoint': endpoint - }) + } - # Store pubkey on instance for form_valid() - self.request.session['client_pubkey'] = client_pubkey + # Add properties to template context + context['domains'] = filtered_domains + context.update(data) + + # Store info on instance for reuse + self.request.session.update(data) except Exception as e: messages.warning(f"Client key generation failed: {e}") From 8e9b2a0631a47736c10ad4f19999415f842951a9 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 22 Mar 2026 18:14:46 +0000 Subject: [PATCH 17/34] wireguard: Create view to handle client config actions Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/views.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plinth/modules/wireguard/views.py b/plinth/modules/wireguard/views.py index ef596e701..2f0a72872 100644 --- a/plinth/modules/wireguard/views.py +++ b/plinth/modules/wireguard/views.py @@ -7,7 +7,7 @@ import urllib.parse from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin -from django.http import Http404 +from django.http import Http404, HttpResponse from django.shortcuts import redirect from django.urls import reverse_lazy from django.utils.translation import gettext as _ @@ -112,6 +112,20 @@ class SessionClientDataMixin: ) +class ClientActionsView(SessionClientDataMixin, View): + action = None + + def get(self, request): + if self.action == 'download': + config = self.get_client_config(request) + response = HttpResponse(config, content_type='text/plain') + response['Content-Disposition'] = \ + 'attachment; filename="wg-client.conf"' + return response + + raise Http404("Invalid action") + + class AutoAddClientView(SuccessMessageMixin, FormView): """View to add a client with keypair generation.""" form_class = forms.AutoAddClientForm From ce2ce04979b6dfd97f870493e40531b80e69595e Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 22 Mar 2026 18:50:53 +0000 Subject: [PATCH 18/34] wireguard: Create URL for client config download action Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/urls.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plinth/modules/wireguard/urls.py b/plinth/modules/wireguard/urls.py index 2f0e257fb..88504d6b2 100644 --- a/plinth/modules/wireguard/urls.py +++ b/plinth/modules/wireguard/urls.py @@ -15,6 +15,9 @@ urlpatterns = [ name='add-client'), re_path(r'^apps/wireguard/client/auto-add/$', views.AutoAddClientView.as_view(), name='auto-add-client'), + re_path(r'^apps/wireguard/client/auto-add/action/download/$', + views.ClientActionsView.as_view(action='download'), + name='auto-add-client-download'), re_path(r'^apps/wireguard/client/(?P[^/]+)/show/$', views.ShowClientView.as_view(), name='show-client'), re_path(r'^apps/wireguard/client/(?P[^/]+)/edit/$', From 79c978e03a6a87324b2faa756f7e22949cdea7ee Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 22 Mar 2026 19:23:22 +0000 Subject: [PATCH 19/34] wireguard: Add client config file section and download button Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- .../templates/wireguard_auto_add_client.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html index 0cff47119..da4d2f1d6 100644 --- a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html +++ b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html @@ -5,6 +5,7 @@ {% load bootstrap %} {% load i18n %} +{% load extras %} {% block content %} @@ -35,6 +36,16 @@
{% endif %} +

{% trans "Client configuration file" %}

+
+ +
From 68e28cdebcc603c0fc07953b53954e612cc8aea4 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Tue, 24 Mar 2026 10:59:18 +0000 Subject: [PATCH 20/34] build-dependencies: Add python3-segno Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index 21d662fa0..b76267564 100644 --- a/debian/control +++ b/debian/control @@ -52,6 +52,7 @@ Build-Depends: python3-pytest-runner , python3-requests, python3-ruamel.yaml, + python3-segno, python3-setuptools, python3-systemd, python3-typeshed , From 18d6f2d5db2309c28a02ce7107271a642cbd68dc Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Tue, 24 Mar 2026 11:01:42 +0000 Subject: [PATCH 21/34] wireguard: Add action for QR code generation Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/views.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plinth/modules/wireguard/views.py b/plinth/modules/wireguard/views.py index 2f0a72872..401bc54d3 100644 --- a/plinth/modules/wireguard/views.py +++ b/plinth/modules/wireguard/views.py @@ -3,6 +3,7 @@ Views for WireGuard application. """ +import segno import urllib.parse from django.contrib import messages @@ -13,6 +14,8 @@ from django.urls import reverse_lazy from django.utils.translation import gettext as _ from django.views.generic import FormView, TemplateView, View +from io import BytesIO + from plinth import network from plinth.modules.names.components import DomainName from plinth.views import AppView @@ -122,6 +125,13 @@ class ClientActionsView(SessionClientDataMixin, View): response['Content-Disposition'] = \ 'attachment; filename="wg-client.conf"' return response + elif self.action == 'qr': + qrcode = segno.make(config) + buffer = BytesIO() + qrcode.save(buffer, kind='svg', scale=5) + + return HttpResponse(buffer.getvalue(), + content_type='image/svg+xml') raise Http404("Invalid action") From f9984ea9e4ea34757c7673ed4ff111f7d7a58b00 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Tue, 24 Mar 2026 11:03:00 +0000 Subject: [PATCH 22/34] themes-icons: Add QR Code icon Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- static/themes/default/icons/qrcode.svg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 static/themes/default/icons/qrcode.svg diff --git a/static/themes/default/icons/qrcode.svg b/static/themes/default/icons/qrcode.svg new file mode 100644 index 000000000..caf229063 --- /dev/null +++ b/static/themes/default/icons/qrcode.svg @@ -0,0 +1,15 @@ + + + + From fa4e6002b32098a3b69f482524b3816978b5b3dc Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Tue, 24 Mar 2026 11:04:49 +0000 Subject: [PATCH 23/34] wireguard: Add Show QR Code button Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- .../wireguard/templates/wireguard_auto_add_client.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html index da4d2f1d6..22a38e8f3 100644 --- a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html +++ b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html @@ -44,6 +44,11 @@ {% icon 'download' %} {% trans "Download config file" %} + + {% icon 'qrcode' %} + {% trans "Show QR Code" %} +
From 5f25fc56a556a251da828ac138d1ee3364d320d0 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Mon, 18 May 2026 01:42:30 +0100 Subject: [PATCH 24/34] wireguard: Create URL for client config QR action Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/urls.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plinth/modules/wireguard/urls.py b/plinth/modules/wireguard/urls.py index 88504d6b2..e2730580d 100644 --- a/plinth/modules/wireguard/urls.py +++ b/plinth/modules/wireguard/urls.py @@ -18,6 +18,9 @@ urlpatterns = [ re_path(r'^apps/wireguard/client/auto-add/action/download/$', views.ClientActionsView.as_view(action='download'), name='auto-add-client-download'), + re_path(r'^apps/wireguard/client/auto-add/action/qr/$', + views.ClientActionsView.as_view(action='qr'), + name='auto-add-client-qr'), re_path(r'^apps/wireguard/client/(?P[^/]+)/show/$', views.ShowClientView.as_view(), name='show-client'), re_path(r'^apps/wireguard/client/(?P[^/]+)/edit/$', From 941a597bc9cb7ae4d8eabb49b21cdc12af84eca3 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Wed, 25 Mar 2026 15:56:41 +0000 Subject: [PATCH 25/34] wireguard: Add security warning in template Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- .../templates/wireguard_auto_add_client.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html index 22a38e8f3..f62346fb6 100644 --- a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html +++ b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html @@ -37,6 +37,19 @@ {% endif %}

{% trans "Client configuration file" %}

+

+ {% blocktrans trimmed %} + Download the configuration file (.conf) for manual import, + or use the QR code to import directly from your WireGuard mobile app. + {% endblocktrans %} +

+

+ {% trans "Warning:" %} + {% blocktrans trimmed %} + Treat this QR code like a password. + Anyone who scans it can gain VPN access if the connection is enabled. + {% endblocktrans %} +

Date: Wed, 25 Mar 2026 19:57:58 +0000 Subject: [PATCH 26/34] mypy: Added override for segno Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 4cd7a3b42..d09b7dd29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -178,6 +178,7 @@ module = [ "plinth.tests.config_local", "pytest_splinter.*", "ruamel.*", + "segno.*", "selenium.*", "splinter.*", "stronghold.*", From bc34a50a24e7c852a90edaec0bdf6ed40985b6ac Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Sun, 19 Apr 2026 20:10:12 +0100 Subject: [PATCH 27/34] wireguard: Include python3-segno in app packages Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plinth/modules/wireguard/__init__.py b/plinth/modules/wireguard/__init__.py index 554465379..1c2ff10da 100644 --- a/plinth/modules/wireguard/__init__.py +++ b/plinth/modules/wireguard/__init__.py @@ -64,7 +64,8 @@ class WireguardApp(app_module.App): clients=info.clients) self.add(shortcut) - packages = Packages('packages-wireguard', ['wireguard']) + packages = Packages('packages-wireguard', + ['wireguard', 'python3-segno']) self.add(packages) firewall = Firewall('firewall-wireguard', info.name, From 050a5366c19c726487602251c8e6c3afa7b23685 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Mon, 20 Apr 2026 17:40:18 +0100 Subject: [PATCH 28/34] wireguard: Bump version Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/wireguard/__init__.py b/plinth/modules/wireguard/__init__.py index 1c2ff10da..50c9fb444 100644 --- a/plinth/modules/wireguard/__init__.py +++ b/plinth/modules/wireguard/__init__.py @@ -37,7 +37,7 @@ class WireguardApp(app_module.App): app_id = 'wireguard' - _version = 1 + _version = 2 def __init__(self) -> None: """Create components for the app.""" From ea48448a72fd4828fda4717376fc6e86999f62dd Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Tue, 21 Apr 2026 19:50:28 +0100 Subject: [PATCH 29/34] wireguard: Added functional test for auto add client flow Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- .../templates/wireguard_auto_add_client.html | 12 +++-- .../wireguard/tests/test_functional.py | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html index f62346fb6..2baa8595d 100644 --- a/plinth/modules/wireguard/templates/wireguard_auto_add_client.html +++ b/plinth/modules/wireguard/templates/wireguard_auto_add_client.html @@ -21,13 +21,15 @@ - + + + +
{% trans "IP Address" %}{{ next_ip }}
{% trans "Endpoint" %}{{ endpoint }}
{% trans "Public Key" %}{{ client_pubkey }}
{% trans "Public Key" %}{{ client_pubkey }}
{% trans "Private Key" %} -
{% trans "Click to reveal" %} +
+ {% trans "Click to reveal" %} {{ client_privkey }} -
-
@@ -65,7 +67,7 @@
- {% trans "Cancel" %} diff --git a/plinth/modules/wireguard/tests/test_functional.py b/plinth/modules/wireguard/tests/test_functional.py index b9ed811fa..071d4c51a 100644 --- a/plinth/modules/wireguard/tests/test_functional.py +++ b/plinth/modules/wireguard/tests/test_functional.py @@ -113,6 +113,53 @@ class TestWireguardApp(functional.BaseAppTests): assert not self._client_exists(session_browser, self._client_public_key2) + def test_auto_add_client(self, session_browser): + """Test the automatic client generation and addition flow.""" + functional.nav_to_module(session_browser, 'wireguard') + + # Start server if needed (reuse existing logic) + # Extract to reusable method + start_server_button = session_browser.find_by_css('.btn-start-server') + if start_server_button: + with functional.wait_for_page_update(session_browser): + start_server_button.first.click() + + session_browser.find_by_css('.btn-auto-add-client').first.click() + + client_pubkey = session_browser.find_by_css( + '.pubkey-val').first.text.strip() + + # Verify private key reveal + privkey_reveal = session_browser.find_by_css( + '.privkey-val') + assert privkey_reveal, "Private key reveal should be present" + privkey_reveal.click() + client_privkey = session_browser.find_by_css( + '.privkey-val').text.splitlines()[1] + assert len(client_privkey) == 44, (("Private key should be base64 " + "(44 chars)")) + + # Verify config download and QR links + download_link = session_browser.links.find_by_href( + '/freedombox/apps/wireguard/client/auto-add/action/download/') + qr_link = session_browser.links.find_by_href( + '/freedombox/apps/wireguard/client/auto-add/action/qr/') + assert download_link, "Download config link should exist" + assert qr_link, "QR code link should exist" + + # Submit to add the client + with functional.wait_for_page_update(session_browser): + session_browser.find_by_css( + '.btn-auto-add-connection').first.click() + + # Verify client was added successfully + assert self._client_exists(session_browser, client_pubkey), (( + "Auto-generated client should exist")) + + # Clean up + self._delete_client(session_browser, client_pubkey) + assert not self._client_exists(session_browser, client_pubkey) + @staticmethod def _get_server_href(browser, key): """Return the href for server show page.""" From 9fd7a3b3afccaceb8fc06daa99632e0a725cb817 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 23 May 2026 08:56:32 -0400 Subject: [PATCH 30/34] debian/control: Add !nocheck for python3-segno Tests: - Succesfully build with nocheck profile: gbp buildpackage --git-pbuilder --git-pbuilder-options="--profiles nocheck" Signed-off-by: James Valleroy --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index b76267564..45d8298cd 100644 --- a/debian/control +++ b/debian/control @@ -52,7 +52,7 @@ Build-Depends: python3-pytest-runner , python3-requests, python3-ruamel.yaml, - python3-segno, + python3-segno , python3-setuptools, python3-systemd, python3-typeshed , From ad1b4203977ce22edef8b028ce05528bf7f5ace9 Mon Sep 17 00:00:00 2001 From: Frederico Gomes Date: Thu, 30 Apr 2026 19:10:16 +0100 Subject: [PATCH 31/34] wireguard: Enable FB to connect to a server using IPv6 This MR enables FreedomBox to connect as a "client" to a WireGuard "server" using IPv6. - Validate IPv4/6 with ip_interface - Created helper functions to build NM settings for IPv4/6 - Modify get_settings to include settings for either IP version 4 or 6 - Created helper function to get NM address info - Modify get_nm_info to work with IPv4 and IPv6 - Modified tests to use validate_ip_address_with_network - Added IPv6 valid and invalid patterns to tests Tested: - IPv4 works unchanged - IPv6 parsing + NM settings generation works - IPv6 display in Show Server UI Not tested: - Needs IPv6 WireGuard server for full connectivity test Closes: #1762 Signed-off-by: Frederico Gomes Reviewed-by: James Valleroy --- plinth/modules/wireguard/forms.py | 66 +++++++++++++------- plinth/modules/wireguard/tests/test_forms.py | 23 +++++-- plinth/modules/wireguard/utils.py | 26 ++++++-- 3 files changed, 79 insertions(+), 36 deletions(-) diff --git a/plinth/modules/wireguard/forms.py b/plinth/modules/wireguard/forms.py index 9b4982bf7..d0515bc15 100644 --- a/plinth/modules/wireguard/forms.py +++ b/plinth/modules/wireguard/forms.py @@ -55,14 +55,12 @@ def validate_endpoint(endpoint): raise ValidationError('Invalid endpoint.') -def validate_ipv4_address_with_network(value: str): - """Check that value is a valid IPv4 address with an optional network.""" +def validate_ip_address_with_network(value: str): + """Check that value is a valid IP address with an optional network.""" try: - ipaddress.IPv4Interface(value) - except ipaddress.AddressValueError: - raise ValidationError(_('Enter a valid IPv4 address.')) - except ipaddress.NetmaskValueError: - raise ValidationError(_('Enter a valid network prefix or net mask.')) + ipaddress.ip_interface(value) + except ValueError: + raise ValidationError(_('Not a valid IP address.')) class AddClientForm(forms.Form): @@ -98,10 +96,11 @@ class AddServerForm(forms.Form): help_text=_( 'IP address assigned to this machine on the VPN after connecting ' 'to the endpoint. This value is usually provided by the server ' - 'operator. Example: 192.168.0.10. You can also specify the ' - 'network. This will allow reaching machines in the network. ' + 'operator. Example: 192.168.0.10 or ' + '2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also specify ' + 'the network. This will allow reaching machines in the network. ' 'Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0.'), - validators=[validate_ipv4_address_with_network]) + validators=[validate_ip_address_with_network]) private_key = forms.CharField( label=_('Private key of this machine'), strip=True, help_text=_( @@ -125,31 +124,44 @@ class AddServerForm(forms.Form): 'Typically checked for a VPN service through which all traffic ' 'is sent.')) + def _build_ipv4_settings(self, iface) -> dict: + """Build IPv4 NM settings from interfaces.""" + return { + 'method': 'manual', + 'address': str(iface.ip), + 'netmask': str(iface.netmask), + 'gateway': '', + 'dns': '', + 'second_dns': '', + } + + def _build_ipv6_settings(self, iface) -> dict: + """Build IPv6 NM settings from interfaces.""" + return { + 'method': 'manual', + 'address': str(iface.ip), + 'prefix': iface.network.prefixlen, + 'gateway': '', + 'dns': '', + 'second_dns': '', + } + def get_settings(self) -> dict[str, dict]: """Return NM settings dict from cleaned data.""" - ip_address_and_network = self.cleaned_data['ip_address_and_network'] - ip_address_and_network = ipaddress.IPv4Interface( - ip_address_and_network) - ip_address = str(ip_address_and_network.ip) - prefixlen = ip_address_and_network.network.prefixlen + ip_interface = ipaddress.ip_interface( + self.cleaned_data['ip_address_and_network'] + ) + if self.cleaned_data['default_route']: allowed_ips = ['0.0.0.0/0', '::/0'] else: - allowed_ips = [f'{ip_address}/{prefixlen}'] + allowed_ips = [str(ip_interface)] settings = { 'common': { 'type': 'wireguard', 'zone': 'external', }, - 'ipv4': { - 'method': 'manual', - 'address': ip_address, - 'netmask': str(ip_address_and_network.netmask), - 'gateway': '', - 'dns': '', - 'second_dns': '', - }, 'wireguard': { 'peer_endpoint': self.cleaned_data['peer_endpoint'], 'peer_public_key': self.cleaned_data['peer_public_key'], @@ -158,4 +170,10 @@ class AddServerForm(forms.Form): 'allowed_ips': allowed_ips, } } + + if ip_interface.version == 4: + settings['ipv4'] = self._build_ipv4_settings(ip_interface) + else: + settings['ipv6'] = self._build_ipv6_settings(ip_interface) + return settings diff --git a/plinth/modules/wireguard/tests/test_forms.py b/plinth/modules/wireguard/tests/test_forms.py index 780cb8d4a..70f986469 100644 --- a/plinth/modules/wireguard/tests/test_forms.py +++ b/plinth/modules/wireguard/tests/test_forms.py @@ -7,7 +7,7 @@ import pytest from django.core.exceptions import ValidationError from plinth.modules.wireguard.forms import (validate_endpoint, - validate_ipv4_address_with_network, + validate_ip_address_with_network, validate_key) @@ -73,22 +73,33 @@ def test_validate_endpoint_invalid_patterns(endpoint): '1.2.3.4/24', '1.2.3.4/255.255.255.0', '1.2.3.4/0.0.0.255', + '::1', + '2001:db8::1', + '2001:db8::1/64', + 'fe80::1/64', + '::/0', ]) -def test_validate_ipv4_address_with_network_valid_patterns(value): +def test_validate_ip_address_with_network_valid_patterns(value): """Test validating IPv4 address with network works for valid values.""" - validate_ipv4_address_with_network(value) + validate_ip_address_with_network(value) @pytest.mark.parametrize('value', [ - '::1', '1.2.3.4/', 'invalid-ip/24', '1.2.3.4/x', '1.2.3.4/-1', '1.2.3.4/33', '1.2.3.4/9.8.7.6', + '2001:db8::1/', + '2001:db8::1/129', + '2001:db8::1/x', + '2001:db8::1/-1', + '2001:db8::1/255.255.255.0', + '2001:db8::1::1', + '12345::1', ]) -def test_validate_ipv4_address_with_network_invalid_patterns(value): +def test_validate_ip_address_with_network_invalid_patterns(value): """Test validating IPv4 address with network works for invalid values.""" with pytest.raises(ValidationError): - validate_ipv4_address_with_network(value) + validate_ip_address_with_network(value) diff --git a/plinth/modules/wireguard/utils.py b/plinth/modules/wireguard/utils.py index 7e632c0dd..0fe35c324 100644 --- a/plinth/modules/wireguard/utils.py +++ b/plinth/modules/wireguard/utils.py @@ -19,6 +19,18 @@ IP_TEMPLATE = '10.84.0.{}' logger = logging.getLogger(__name__) +def _get_nm_address_info(settings_ipv4, settings_ipv6) -> tuple[str, str]: + """Extract IP address info from NM IPv4/IPv6 settings.""" + for settings in [settings_ipv4, settings_ipv6]: + if settings and settings.get_num_addresses(): + nm_address = settings.get_address(0) + address = nm_address.get_address() + prefix = str(nm_address.get_prefix()) + return address, address + '/' + prefix + + return '', '' + + def get_nm_info(): """Get information from network manager.""" setting_name = nm.SETTING_WIREGUARD_SETTING_NAME @@ -64,12 +76,14 @@ def get_nm_info(): info['default_route'] = True settings_ipv4 = connection.get_setting_ip4_config() - if settings_ipv4 and settings_ipv4.get_num_addresses(): - nm_address = settings_ipv4.get_address(0) - address = nm_address.get_address() - prefix = str(nm_address.get_prefix()) - info['ip_address'] = address - info['ip_address_and_network'] = address + '/' + prefix + settings_ipv6 = connection.get_setting_ip6_config() + + ip_address, ip_address_and_network = _get_nm_address_info( + settings_ipv4, settings_ipv6 + ) + + info['ip_address'] = ip_address + info['ip_address_and_network'] = ip_address_and_network connections[info['interface']] = info From 88e886046f77953d7decf14bf651c59adb7fa133 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 1 Jun 2026 20:52:26 -0400 Subject: [PATCH 32/34] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/ar_SA/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/be/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/bg/LC_MESSAGES/django.po | 180 +++++++++++------ plinth/locale/bn/LC_MESSAGES/django.po | 169 +++++++++++----- plinth/locale/ca/LC_MESSAGES/django.po | 179 ++++++++++++----- plinth/locale/cs/LC_MESSAGES/django.po | 206 ++++++++++++++------ plinth/locale/da/LC_MESSAGES/django.po | 187 ++++++++++++------ plinth/locale/de/LC_MESSAGES/django.po | 205 +++++++++++++------ plinth/locale/django.pot | 167 +++++++++++----- plinth/locale/el/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/es/LC_MESSAGES/django.po | 194 ++++++++++++------ plinth/locale/et/LC_MESSAGES/django.po | 177 ++++++++++++----- plinth/locale/fa/LC_MESSAGES/django.po | 195 +++++++++++------- plinth/locale/fake/LC_MESSAGES/django.po | 182 +++++++++++------ plinth/locale/fr/LC_MESSAGES/django.po | 205 +++++++++++++------ plinth/locale/gl/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/gu/LC_MESSAGES/django.po | 183 +++++++++++------ plinth/locale/hi/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/hu/LC_MESSAGES/django.po | 194 ++++++++++++------ plinth/locale/id/LC_MESSAGES/django.po | 194 ++++++++++++------ plinth/locale/it/LC_MESSAGES/django.po | 202 +++++++++++++------ plinth/locale/ja/LC_MESSAGES/django.po | 169 +++++++++++----- plinth/locale/kn/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/lt/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/lv/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/nb/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/nl/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/pl/LC_MESSAGES/django.po | 189 ++++++++++++------ plinth/locale/pt/LC_MESSAGES/django.po | 189 ++++++++++++------ plinth/locale/ru/LC_MESSAGES/django.po | 194 ++++++++++++------ plinth/locale/si/LC_MESSAGES/django.po | 167 +++++++++++----- plinth/locale/sl/LC_MESSAGES/django.po | 180 +++++++++++------ plinth/locale/sq/LC_MESSAGES/django.po | 206 ++++++++++++++------ plinth/locale/sr/LC_MESSAGES/django.po | 171 +++++++++++----- plinth/locale/sv/LC_MESSAGES/django.po | 204 +++++++++++++------ plinth/locale/ta/LC_MESSAGES/django.po | 179 ++++++++++++----- plinth/locale/te/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/tr/LC_MESSAGES/django.po | 204 +++++++++++++------ plinth/locale/uk/LC_MESSAGES/django.po | 192 ++++++++++++------ plinth/locale/vi/LC_MESSAGES/django.po | 173 +++++++++++----- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 196 +++++++++++++------ plinth/locale/zh_Hant/LC_MESSAGES/django.po | 173 +++++++++++----- 43 files changed, 5409 insertions(+), 2525 deletions(-) diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 931f236d5..d6c3ec852 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2025-04-16 02:28+0000\n" "Last-Translator: MohammedSaalif <2300031323@kluniversity.in>\n" "Language-Team: Arabic \n" "Language-Team: Arabic (Saudi Arabia) \n" @@ -2072,6 +2072,7 @@ msgid "Last update" msgstr "Последно обновяване" #: plinth/modules/dynamicdns/templates/dynamicdns.html:29 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:22 msgid "IP Address" msgstr "Адрес по IP" @@ -5647,6 +5648,7 @@ msgstr "" #: plinth/modules/networks/templates/connections_list.html:20 #: plinth/modules/networks/views.py:420 #: plinth/modules/wireguard/templates/wireguard_add_server.html:19 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:71 msgid "Add Connection" msgstr "" @@ -9259,6 +9261,7 @@ msgstr "Премахване на потребител" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:73 msgid "Cancel" msgstr "Отказ" @@ -9379,65 +9382,62 @@ msgstr "" #: plinth/modules/wireguard/forms.py:63 #, fuzzy #| msgid "Enter a valid username." -msgid "Enter a valid IPv4 address." +msgid "Not a valid IP address." msgstr "Въведете съществуващо потребителско име." -#: plinth/modules/wireguard/forms.py:65 -msgid "Enter a valid network prefix or net mask." -msgstr "" - -#: plinth/modules/wireguard/forms.py:71 +#: plinth/modules/wireguard/forms.py:69 #: plinth/modules/wireguard/templates/wireguard.html:29 #: plinth/modules/wireguard/templates/wireguard.html:57 -#: plinth/modules/wireguard/templates/wireguard.html:119 +#: plinth/modules/wireguard/templates/wireguard.html:125 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:24 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:24 msgid "Public Key" msgstr "" -#: plinth/modules/wireguard/forms.py:72 +#: plinth/modules/wireguard/forms.py:70 msgid "" "Public key of the peer. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:80 +#: plinth/modules/wireguard/forms.py:83 msgid "Endpoint of the server" msgstr "" -#: plinth/modules/wireguard/forms.py:81 +#: plinth/modules/wireguard/forms.py:84 msgid "" "Domain name and port in the form \"ip:port\". Example: " "demo.wireguard.com:12912 ." msgstr "" -#: plinth/modules/wireguard/forms.py:86 +#: plinth/modules/wireguard/forms.py:89 msgid "Public key of the server" msgstr "" -#: plinth/modules/wireguard/forms.py:87 +#: plinth/modules/wireguard/forms.py:90 msgid "" "Provided by the server operator, a long string of characters. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:92 +#: plinth/modules/wireguard/forms.py:95 msgid "Client IP address provided by server" msgstr "" -#: plinth/modules/wireguard/forms.py:94 +#: plinth/modules/wireguard/forms.py:97 msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " -"192.168.0.10. You can also specify the network. This will allow reaching " -"machines in the network. Examples: 10.68.12.43/24 or " -"10.68.12.43/255.255.255.0." +"192.168.0.10 or 2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also " +"specify the network. This will allow reaching machines in the network. " +"Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0." msgstr "" -#: plinth/modules/wireguard/forms.py:102 +#: plinth/modules/wireguard/forms.py:106 msgid "Private key of this machine" msgstr "" -#: plinth/modules/wireguard/forms.py:103 +#: plinth/modules/wireguard/forms.py:107 msgid "" "Optional. New public/private keys are generated if left blank. Public key " "can then be provided to the server. This is the recommended way. However, " @@ -9445,22 +9445,22 @@ msgid "" "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:111 +#: plinth/modules/wireguard/forms.py:115 msgid "Pre-shared key" msgstr "" -#: plinth/modules/wireguard/forms.py:112 +#: plinth/modules/wireguard/forms.py:116 msgid "" "Optional. A shared secret key provided by the server to add an additional " "layer of security. Fill in only if provided. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=." msgstr "" -#: plinth/modules/wireguard/forms.py:118 +#: plinth/modules/wireguard/forms.py:122 msgid "Use this connection to send all outgoing traffic" msgstr "" -#: plinth/modules/wireguard/forms.py:120 +#: plinth/modules/wireguard/forms.py:124 msgid "Typically checked for a VPN service through which all traffic is sent." msgstr "" @@ -9511,7 +9511,7 @@ msgid "Allowed IPs" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:59 -#: plinth/modules/wireguard/templates/wireguard.html:120 +#: plinth/modules/wireguard/templates/wireguard.html:126 msgid "Last Connected Time" msgstr "" @@ -9521,49 +9521,58 @@ msgid "No peers configured to connect to this %(box_name)s yet." msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:88 -msgid "Add a new peer" +msgid "Auto add a new peer" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:92 -#: plinth/modules/wireguard/views.py:59 +msgid "Add Client Automatically" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:94 +msgid "Add a new peer" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:98 +#: plinth/modules/wireguard/views.py:62 plinth/modules/wireguard/views.py:149 msgid "Add Allowed Client" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:97 +#: plinth/modules/wireguard/templates/wireguard.html:103 #, fuzzy #| msgid "Password changed successfully." msgid "WireGuard server not started yet." msgstr "Паролата е променена." -#: plinth/modules/wireguard/templates/wireguard.html:101 -#: plinth/modules/wireguard/templates/wireguard.html:103 +#: plinth/modules/wireguard/templates/wireguard.html:107 +#: plinth/modules/wireguard/templates/wireguard.html:109 msgid "Start WireGuard Server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:109 +#: plinth/modules/wireguard/templates/wireguard.html:115 msgid "As a Client" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:111 +#: plinth/modules/wireguard/templates/wireguard.html:117 #, python-format msgid "Servers that %(box_name)s will connect to:" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:118 +#: plinth/modules/wireguard/templates/wireguard.html:124 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:23 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:20 msgid "Endpoint" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:142 +#: plinth/modules/wireguard/templates/wireguard.html:148 msgid "No connections to remote servers are configured yet." msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:152 +#: plinth/modules/wireguard/templates/wireguard.html:158 msgid "Add a new server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:156 -#: plinth/modules/wireguard/views.py:178 +#: plinth/modules/wireguard/templates/wireguard.html:162 +#: plinth/modules/wireguard/views.py:301 msgid "Add Connection to Server" msgstr "" @@ -9575,6 +9584,58 @@ msgstr "" msgid "Add Client" msgstr "" +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:26 +#, fuzzy +#| msgid "Privacy" +msgid "Private Key" +msgstr "Поверителност" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:29 +msgid "Click to reveal" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:36 +msgid "Important:" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:37 +msgid "Save the private key now. This page shows it only once!" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:41 +#, fuzzy +#| msgid "Configuration" +msgid "Client configuration file" +msgstr "Настройки" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:43 +msgid "" +"Download the configuration file (.conf) for manual import, or use the QR " +"code to import directly from your WireGuard mobile app." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:49 +#, fuzzy +#| msgid "warning" +msgid "Warning:" +msgstr "предупреждение" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:50 +msgid "" +"Treat this QR code like a password. Anyone who scans it can gain VPN access " +"if the connection is enabled." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:60 +msgid "Download config file" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:65 +#, fuzzy +#| msgid "Source Code" +msgid "Show QR Code" +msgstr "Изходен код" + #: plinth/modules/wireguard/templates/wireguard_delete_client.html:14 msgid "Are you sure that you want to delete this client?" msgstr "" @@ -9663,69 +9724,79 @@ msgstr "" msgid "All outgoing traffic is sent using this connection:" msgstr "" -#: plinth/modules/wireguard/views.py:54 +#: plinth/modules/wireguard/views.py:57 plinth/modules/wireguard/views.py:144 msgid "Added new client." msgstr "" -#: plinth/modules/wireguard/views.py:79 plinth/modules/wireguard/views.py:138 +#: plinth/modules/wireguard/views.py:82 plinth/modules/wireguard/views.py:261 msgid "Client with public key already exists" msgstr "" -#: plinth/modules/wireguard/views.py:92 +#: plinth/modules/wireguard/views.py:199 +msgid "Session expired. Please try again." +msgstr "" + +#: plinth/modules/wireguard/views.py:202 +#, fuzzy +#| msgid "Domain already exists." +msgid "Client already exists" +msgstr "Домейнът вече съществува." + +#: plinth/modules/wireguard/views.py:215 msgid "Allowed Client" msgstr "" -#: plinth/modules/wireguard/views.py:114 +#: plinth/modules/wireguard/views.py:237 msgid "Updated client." msgstr "Настройките на клиентското приложение са променени." -#: plinth/modules/wireguard/views.py:119 +#: plinth/modules/wireguard/views.py:242 msgid "Modify Client" msgstr "" -#: plinth/modules/wireguard/views.py:152 +#: plinth/modules/wireguard/views.py:275 msgid "Delete Allowed Client" msgstr "" -#: plinth/modules/wireguard/views.py:161 +#: plinth/modules/wireguard/views.py:284 msgid "Client deleted." msgstr "" -#: plinth/modules/wireguard/views.py:163 +#: plinth/modules/wireguard/views.py:286 msgid "Client not found" msgstr "" -#: plinth/modules/wireguard/views.py:173 +#: plinth/modules/wireguard/views.py:296 msgid "Added new server." msgstr "" -#: plinth/modules/wireguard/views.py:194 +#: plinth/modules/wireguard/views.py:317 msgid "Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:212 +#: plinth/modules/wireguard/views.py:335 msgid "Updated server." msgstr "Настройките на сървъра са променени." -#: plinth/modules/wireguard/views.py:217 +#: plinth/modules/wireguard/views.py:340 msgid "Modify Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:255 +#: plinth/modules/wireguard/views.py:378 msgid "Delete Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:275 +#: plinth/modules/wireguard/views.py:398 msgid "Server deleted." msgstr "" -#: plinth/modules/wireguard/views.py:287 +#: plinth/modules/wireguard/views.py:410 #, fuzzy #| msgid "Password changed successfully." msgid "WireGuard server started successfully." msgstr "Паролата е променена." -#: plinth/modules/wireguard/views.py:291 +#: plinth/modules/wireguard/views.py:414 msgid "Failed to start WireGuard server: {}" msgstr "" @@ -10538,9 +10609,6 @@ msgstr "Гуджарати" #~ msgid "Deleting LDAP user failed." #~ msgstr "Потребителят на LDAP не е премахнат." -#~ msgid "Source Code" -#~ msgstr "Изходен код" - #~ msgid "FreedomBox Foundation" #~ msgstr "Фондация FreedomBox" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 485da99df..d8209badd 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2025-04-01 03:02+0000\n" "Last-Translator: MURALA SAI GANESH \n" "Language-Team: Bengali \n" "Language-Team: Catalan \n" "Language-Team: Czech \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: LANGUAGE \n" @@ -1945,6 +1945,7 @@ msgid "Last update" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:29 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:22 msgid "IP Address" msgstr "" @@ -5332,6 +5333,7 @@ msgstr "" #: plinth/modules/networks/templates/connections_list.html:20 #: plinth/modules/networks/views.py:420 #: plinth/modules/wireguard/templates/wireguard_add_server.html:19 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:71 msgid "Add Connection" msgstr "" @@ -8676,6 +8678,7 @@ msgstr "" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:73 msgid "Cancel" msgstr "" @@ -8783,65 +8786,62 @@ msgid "Invalid key." msgstr "" #: plinth/modules/wireguard/forms.py:63 -msgid "Enter a valid IPv4 address." +msgid "Not a valid IP address." msgstr "" -#: plinth/modules/wireguard/forms.py:65 -msgid "Enter a valid network prefix or net mask." -msgstr "" - -#: plinth/modules/wireguard/forms.py:71 +#: plinth/modules/wireguard/forms.py:69 #: plinth/modules/wireguard/templates/wireguard.html:29 #: plinth/modules/wireguard/templates/wireguard.html:57 -#: plinth/modules/wireguard/templates/wireguard.html:119 +#: plinth/modules/wireguard/templates/wireguard.html:125 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:24 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:24 msgid "Public Key" msgstr "" -#: plinth/modules/wireguard/forms.py:72 +#: plinth/modules/wireguard/forms.py:70 msgid "" "Public key of the peer. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:80 +#: plinth/modules/wireguard/forms.py:83 msgid "Endpoint of the server" msgstr "" -#: plinth/modules/wireguard/forms.py:81 +#: plinth/modules/wireguard/forms.py:84 msgid "" "Domain name and port in the form \"ip:port\". Example: " "demo.wireguard.com:12912 ." msgstr "" -#: plinth/modules/wireguard/forms.py:86 +#: plinth/modules/wireguard/forms.py:89 msgid "Public key of the server" msgstr "" -#: plinth/modules/wireguard/forms.py:87 +#: plinth/modules/wireguard/forms.py:90 msgid "" "Provided by the server operator, a long string of characters. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:92 +#: plinth/modules/wireguard/forms.py:95 msgid "Client IP address provided by server" msgstr "" -#: plinth/modules/wireguard/forms.py:94 +#: plinth/modules/wireguard/forms.py:97 msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " -"192.168.0.10. You can also specify the network. This will allow reaching " -"machines in the network. Examples: 10.68.12.43/24 or " -"10.68.12.43/255.255.255.0." +"192.168.0.10 or 2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also " +"specify the network. This will allow reaching machines in the network. " +"Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0." msgstr "" -#: plinth/modules/wireguard/forms.py:102 +#: plinth/modules/wireguard/forms.py:106 msgid "Private key of this machine" msgstr "" -#: plinth/modules/wireguard/forms.py:103 +#: plinth/modules/wireguard/forms.py:107 msgid "" "Optional. New public/private keys are generated if left blank. Public key " "can then be provided to the server. This is the recommended way. However, " @@ -8849,22 +8849,22 @@ msgid "" "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:111 +#: plinth/modules/wireguard/forms.py:115 msgid "Pre-shared key" msgstr "" -#: plinth/modules/wireguard/forms.py:112 +#: plinth/modules/wireguard/forms.py:116 msgid "" "Optional. A shared secret key provided by the server to add an additional " "layer of security. Fill in only if provided. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=." msgstr "" -#: plinth/modules/wireguard/forms.py:118 +#: plinth/modules/wireguard/forms.py:122 msgid "Use this connection to send all outgoing traffic" msgstr "" -#: plinth/modules/wireguard/forms.py:120 +#: plinth/modules/wireguard/forms.py:124 msgid "Typically checked for a VPN service through which all traffic is sent." msgstr "" @@ -8911,7 +8911,7 @@ msgid "Allowed IPs" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:59 -#: plinth/modules/wireguard/templates/wireguard.html:120 +#: plinth/modules/wireguard/templates/wireguard.html:126 msgid "Last Connected Time" msgstr "" @@ -8921,47 +8921,56 @@ msgid "No peers configured to connect to this %(box_name)s yet." msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:88 -msgid "Add a new peer" +msgid "Auto add a new peer" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:92 -#: plinth/modules/wireguard/views.py:59 +msgid "Add Client Automatically" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:94 +msgid "Add a new peer" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:98 +#: plinth/modules/wireguard/views.py:62 plinth/modules/wireguard/views.py:149 msgid "Add Allowed Client" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:97 +#: plinth/modules/wireguard/templates/wireguard.html:103 msgid "WireGuard server not started yet." msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:101 -#: plinth/modules/wireguard/templates/wireguard.html:103 +#: plinth/modules/wireguard/templates/wireguard.html:107 +#: plinth/modules/wireguard/templates/wireguard.html:109 msgid "Start WireGuard Server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:109 +#: plinth/modules/wireguard/templates/wireguard.html:115 msgid "As a Client" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:111 +#: plinth/modules/wireguard/templates/wireguard.html:117 #, python-format msgid "Servers that %(box_name)s will connect to:" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:118 +#: plinth/modules/wireguard/templates/wireguard.html:124 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:23 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:20 msgid "Endpoint" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:142 +#: plinth/modules/wireguard/templates/wireguard.html:148 msgid "No connections to remote servers are configured yet." msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:152 +#: plinth/modules/wireguard/templates/wireguard.html:158 msgid "Add a new server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:156 -#: plinth/modules/wireguard/views.py:178 +#: plinth/modules/wireguard/templates/wireguard.html:162 +#: plinth/modules/wireguard/views.py:301 msgid "Add Connection to Server" msgstr "" @@ -8973,6 +8982,50 @@ msgstr "" msgid "Add Client" msgstr "" +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:26 +msgid "Private Key" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:29 +msgid "Click to reveal" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:36 +msgid "Important:" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:37 +msgid "Save the private key now. This page shows it only once!" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:41 +msgid "Client configuration file" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:43 +msgid "" +"Download the configuration file (.conf) for manual import, or use the QR " +"code to import directly from your WireGuard mobile app." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:49 +msgid "Warning:" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:50 +msgid "" +"Treat this QR code like a password. Anyone who scans it can gain VPN access " +"if the connection is enabled." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:60 +msgid "Download config file" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:65 +msgid "Show QR Code" +msgstr "" + #: plinth/modules/wireguard/templates/wireguard_delete_client.html:14 msgid "Are you sure that you want to delete this client?" msgstr "" @@ -9061,67 +9114,75 @@ msgstr "" msgid "All outgoing traffic is sent using this connection:" msgstr "" -#: plinth/modules/wireguard/views.py:54 +#: plinth/modules/wireguard/views.py:57 plinth/modules/wireguard/views.py:144 msgid "Added new client." msgstr "" -#: plinth/modules/wireguard/views.py:79 plinth/modules/wireguard/views.py:138 +#: plinth/modules/wireguard/views.py:82 plinth/modules/wireguard/views.py:261 msgid "Client with public key already exists" msgstr "" -#: plinth/modules/wireguard/views.py:92 +#: plinth/modules/wireguard/views.py:199 +msgid "Session expired. Please try again." +msgstr "" + +#: plinth/modules/wireguard/views.py:202 +msgid "Client already exists" +msgstr "" + +#: plinth/modules/wireguard/views.py:215 msgid "Allowed Client" msgstr "" -#: plinth/modules/wireguard/views.py:114 +#: plinth/modules/wireguard/views.py:237 msgid "Updated client." msgstr "" -#: plinth/modules/wireguard/views.py:119 +#: plinth/modules/wireguard/views.py:242 msgid "Modify Client" msgstr "" -#: plinth/modules/wireguard/views.py:152 +#: plinth/modules/wireguard/views.py:275 msgid "Delete Allowed Client" msgstr "" -#: plinth/modules/wireguard/views.py:161 +#: plinth/modules/wireguard/views.py:284 msgid "Client deleted." msgstr "" -#: plinth/modules/wireguard/views.py:163 +#: plinth/modules/wireguard/views.py:286 msgid "Client not found" msgstr "" -#: plinth/modules/wireguard/views.py:173 +#: plinth/modules/wireguard/views.py:296 msgid "Added new server." msgstr "" -#: plinth/modules/wireguard/views.py:194 +#: plinth/modules/wireguard/views.py:317 msgid "Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:212 +#: plinth/modules/wireguard/views.py:335 msgid "Updated server." msgstr "" -#: plinth/modules/wireguard/views.py:217 +#: plinth/modules/wireguard/views.py:340 msgid "Modify Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:255 +#: plinth/modules/wireguard/views.py:378 msgid "Delete Connection to Server" msgstr "" -#: plinth/modules/wireguard/views.py:275 +#: plinth/modules/wireguard/views.py:398 msgid "Server deleted." msgstr "" -#: plinth/modules/wireguard/views.py:287 +#: plinth/modules/wireguard/views.py:410 msgid "WireGuard server started successfully." msgstr "" -#: plinth/modules/wireguard/views.py:291 +#: plinth/modules/wireguard/views.py:414 msgid "Failed to start WireGuard server: {}" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 39260fb47..6b5184bbf 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2026-02-22 13:17+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Greek \n" "Language-Team: Spanish \n" "Language-Team: Estonian \n" "Language-Team: Persian ویکی %(box_name)s را ببینید." -#~ msgid "Source Code" -#~ msgstr "کد منبع" - #, fuzzy #~ msgid "FreedomBox Foundation" #~ msgstr "FreedomBox" @@ -11203,9 +11273,6 @@ msgstr "" #~ msgid "OpenPGP User IDs" #~ msgstr "شناسه‌های کاربری OpenPGP" -#~ msgid "Key Import Date" -#~ msgstr "تاریخ درون‌ریزی کلید" - #~ msgid "SSH Key Type" #~ msgstr "نوع کلید SSH" @@ -11297,11 +11364,6 @@ msgstr "" #~ msgid "Certificate path" #~ msgstr "وضعیت گواهی دیجیتال" -#, fuzzy -#~| msgid "Create Connection" -#~ msgid "Private key path" -#~ msgstr "ساختن اتصال" - #, fuzzy #~| msgid "Enabled" #~ msgid "Enabled aliases" @@ -11501,11 +11563,6 @@ msgstr "" #~ "Pagekite setup finished. The HTTP and HTTPS services are activated now." #~ msgstr "راه‌اندازی Pagekite پایان یافت. سرویس‌های HTTP و HTTPS فعال هستند." -#, fuzzy -#~| msgid "{box_name} Manual" -#~ msgid "Download Manual" -#~ msgstr "کتاب راهنمای {box_name}" - #, fuzzy #~ msgid "Dynamic DNS Service" #~ msgstr "برنامهٔ DNS متغیر (Dynamic DNS Client)" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 75d7bf687..3376913b2 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Gujarati \n" "Language-Team: Hindi \n" @@ -2254,6 +2254,7 @@ msgid "Last update" msgstr "Legutolsó frissítés" #: plinth/modules/dynamicdns/templates/dynamicdns.html:29 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:22 msgid "IP Address" msgstr "IP-cím" @@ -6280,6 +6281,7 @@ msgstr "Wi-Fi hálózatok a közelben" #: plinth/modules/networks/templates/connections_list.html:20 #: plinth/modules/networks/views.py:420 #: plinth/modules/wireguard/templates/wireguard_add_server.html:19 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:71 msgid "Add Connection" msgstr "Kapcsolat hozzáadása" @@ -10294,6 +10296,7 @@ msgstr "Felhasználó törlése" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:73 msgid "Cancel" msgstr "Mégse" @@ -10419,22 +10422,19 @@ msgstr "Érvénytelen kulcs." #: plinth/modules/wireguard/forms.py:63 #, fuzzy #| msgid "Enter a valid username." -msgid "Enter a valid IPv4 address." +msgid "Not a valid IP address." msgstr "Adj meg egy érvényes felhasználónevet." -#: plinth/modules/wireguard/forms.py:65 -msgid "Enter a valid network prefix or net mask." -msgstr "" - -#: plinth/modules/wireguard/forms.py:71 +#: plinth/modules/wireguard/forms.py:69 #: plinth/modules/wireguard/templates/wireguard.html:29 #: plinth/modules/wireguard/templates/wireguard.html:57 -#: plinth/modules/wireguard/templates/wireguard.html:119 +#: plinth/modules/wireguard/templates/wireguard.html:125 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:24 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:24 msgid "Public Key" msgstr "Nyilvános kulcs" -#: plinth/modules/wireguard/forms.py:72 +#: plinth/modules/wireguard/forms.py:70 msgid "" "Public key of the peer. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." @@ -10442,22 +10442,22 @@ msgstr "" "A partner nyilvános kulcsa. Például: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." -#: plinth/modules/wireguard/forms.py:80 +#: plinth/modules/wireguard/forms.py:83 msgid "Endpoint of the server" msgstr "A szerver végpontja" -#: plinth/modules/wireguard/forms.py:81 +#: plinth/modules/wireguard/forms.py:84 msgid "" "Domain name and port in the form \"ip:port\". Example: " "demo.wireguard.com:12912 ." msgstr "" "Domainnév és port \"ip:port\" formában. Például: demo.wireguard.com:12912 ." -#: plinth/modules/wireguard/forms.py:86 +#: plinth/modules/wireguard/forms.py:89 msgid "Public key of the server" msgstr "A szerver nyilvános kulcsa" -#: plinth/modules/wireguard/forms.py:87 +#: plinth/modules/wireguard/forms.py:90 msgid "" "Provided by the server operator, a long string of characters. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." @@ -10465,11 +10465,11 @@ msgstr "" "A szerver üzemeltetője által megadott hosszú karakterlánc. Például: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." -#: plinth/modules/wireguard/forms.py:92 +#: plinth/modules/wireguard/forms.py:95 msgid "Client IP address provided by server" msgstr "A szerver által megadott kliens IP-cím" -#: plinth/modules/wireguard/forms.py:94 +#: plinth/modules/wireguard/forms.py:97 #, fuzzy #| msgid "" #| "IP address assigned to this machine on the VPN after connecting to the " @@ -10478,19 +10478,19 @@ msgstr "A szerver által megadott kliens IP-cím" msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " -"192.168.0.10. You can also specify the network. This will allow reaching " -"machines in the network. Examples: 10.68.12.43/24 or " -"10.68.12.43/255.255.255.0." +"192.168.0.10 or 2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also " +"specify the network. This will allow reaching machines in the network. " +"Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0." msgstr "" "A gépnek a VPN-en a végponthoz való csatlakozást követően kijelölt IP-cím. " "Ezt az értéket általában a szerver üzemeltetője adja meg. Például: " "192.168.0.10." -#: plinth/modules/wireguard/forms.py:102 +#: plinth/modules/wireguard/forms.py:106 msgid "Private key of this machine" msgstr "A gép privát kulcsa" -#: plinth/modules/wireguard/forms.py:103 +#: plinth/modules/wireguard/forms.py:107 msgid "" "Optional. New public/private keys are generated if left blank. Public key " "can then be provided to the server. This is the recommended way. However, " @@ -10502,11 +10502,11 @@ msgstr "" "módszer. Egyes szerverüzemeltetők azonban ragaszkodnak ennek megadásához. " "Például: MConEJFIg6+DFHgg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." -#: plinth/modules/wireguard/forms.py:111 +#: plinth/modules/wireguard/forms.py:115 msgid "Pre-shared key" msgstr "Előre megosztott kulcs" -#: plinth/modules/wireguard/forms.py:112 +#: plinth/modules/wireguard/forms.py:116 msgid "" "Optional. A shared secret key provided by the server to add an additional " "layer of security. Fill in only if provided. Example: " @@ -10516,11 +10516,11 @@ msgstr "" "további biztonsági szintet biztosít. Csak akkor töltsd ki, ha rendelkezésre " "áll. Például: MConEJFIg6+DFHgg2J1nn9SNLOSE9KR0ysdPgmPjibEs=." -#: plinth/modules/wireguard/forms.py:118 +#: plinth/modules/wireguard/forms.py:122 msgid "Use this connection to send all outgoing traffic" msgstr "Használja ezt a kapcsolatot az összes kimenő forgalom küldésére" -#: plinth/modules/wireguard/forms.py:120 +#: plinth/modules/wireguard/forms.py:124 msgid "Typically checked for a VPN service through which all traffic is sent." msgstr "" "Jellemzően olyan VPN-szolgáltatásnál van bejelölve, amelyen keresztül az " @@ -10575,7 +10575,7 @@ msgid "Allowed IPs" msgstr "Engedélyezett IP-címek" #: plinth/modules/wireguard/templates/wireguard.html:59 -#: plinth/modules/wireguard/templates/wireguard.html:120 +#: plinth/modules/wireguard/templates/wireguard.html:126 msgid "Last Connected Time" msgstr "Utolsó csatlakozási idő" @@ -10585,49 +10585,60 @@ msgid "No peers configured to connect to this %(box_name)s yet." msgstr "Ehhez a %(box_name)shoz még nincs partner konfigurálva." #: plinth/modules/wireguard/templates/wireguard.html:88 -msgid "Add a new peer" +#, fuzzy +#| msgid "Add a new peer" +msgid "Auto add a new peer" msgstr "Új társ hozzáadása" #: plinth/modules/wireguard/templates/wireguard.html:92 -#: plinth/modules/wireguard/views.py:59 +msgid "Add Client Automatically" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:94 +msgid "Add a new peer" +msgstr "Új társ hozzáadása" + +#: plinth/modules/wireguard/templates/wireguard.html:98 +#: plinth/modules/wireguard/views.py:62 plinth/modules/wireguard/views.py:149 msgid "Add Allowed Client" msgstr "Engedélyezett kliens hozzáadása" -#: plinth/modules/wireguard/templates/wireguard.html:97 +#: plinth/modules/wireguard/templates/wireguard.html:103 #, fuzzy #| msgid "Password changed successfully." msgid "WireGuard server not started yet." msgstr "A jelszó módosítása sikeres." -#: plinth/modules/wireguard/templates/wireguard.html:101 -#: plinth/modules/wireguard/templates/wireguard.html:103 +#: plinth/modules/wireguard/templates/wireguard.html:107 +#: plinth/modules/wireguard/templates/wireguard.html:109 msgid "Start WireGuard Server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:109 +#: plinth/modules/wireguard/templates/wireguard.html:115 msgid "As a Client" msgstr "Ügyfélként" -#: plinth/modules/wireguard/templates/wireguard.html:111 +#: plinth/modules/wireguard/templates/wireguard.html:117 #, python-format msgid "Servers that %(box_name)s will connect to:" msgstr "Szerverek, amelyekhez a %(box_name)s csatlakozni fog:" -#: plinth/modules/wireguard/templates/wireguard.html:118 +#: plinth/modules/wireguard/templates/wireguard.html:124 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:23 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:20 msgid "Endpoint" msgstr "Végpont" -#: plinth/modules/wireguard/templates/wireguard.html:142 +#: plinth/modules/wireguard/templates/wireguard.html:148 msgid "No connections to remote servers are configured yet." msgstr "A távoli szerverekhez még nincsenek konfigurálva kapcsolatok." -#: plinth/modules/wireguard/templates/wireguard.html:152 +#: plinth/modules/wireguard/templates/wireguard.html:158 msgid "Add a new server" msgstr "Új szerver hozzáadása" -#: plinth/modules/wireguard/templates/wireguard.html:156 -#: plinth/modules/wireguard/views.py:178 +#: plinth/modules/wireguard/templates/wireguard.html:162 +#: plinth/modules/wireguard/views.py:301 msgid "Add Connection to Server" msgstr "Kapcsolat hozzáadása a szerverhez" @@ -10641,6 +10652,62 @@ msgstr "A kliens által használt IP-cím:" msgid "Add Client" msgstr "Kliens hozzáadása" +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:26 +#, fuzzy +#| msgid "Private repository" +msgid "Private Key" +msgstr "Privát tároló" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:29 +msgid "Click to reveal" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:36 +#, fuzzy +#| msgid "Key Import Date" +msgid "Important:" +msgstr "Kulcs importálásának dátuma" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:37 +msgid "Save the private key now. This page shows it only once!" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:41 +#, fuzzy +#| msgid "configuration failed" +msgid "Client configuration file" +msgstr "konfiguráció sikertelen" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:43 +msgid "" +"Download the configuration file (.conf) for manual import, or use the QR " +"code to import directly from your WireGuard mobile app." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:49 +#, fuzzy +#| msgid "warning" +msgid "Warning:" +msgstr "figyelmeztetés" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:50 +msgid "" +"Treat this QR code like a password. Anyone who scans it can gain VPN access " +"if the connection is enabled." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:60 +#, fuzzy +#| msgid "Download my profile" +msgid "Download config file" +msgstr "Saját profilom letöltése" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:65 +#, fuzzy +#| msgid "Source Code" +msgid "Show QR Code" +msgstr "Forráskód" + #: plinth/modules/wireguard/templates/wireguard_delete_client.html:14 msgid "Are you sure that you want to delete this client?" msgstr "Biztosan el szeretnéd távolítani ezt az klienst?" @@ -10734,69 +10801,79 @@ msgstr "A gép IP-címe:" msgid "All outgoing traffic is sent using this connection:" msgstr "" -#: plinth/modules/wireguard/views.py:54 +#: plinth/modules/wireguard/views.py:57 plinth/modules/wireguard/views.py:144 msgid "Added new client." msgstr "Új kliens hozzáadva." -#: plinth/modules/wireguard/views.py:79 plinth/modules/wireguard/views.py:138 +#: plinth/modules/wireguard/views.py:82 plinth/modules/wireguard/views.py:261 msgid "Client with public key already exists" msgstr "Ezzel a nyilvános kulccsal már létezik kliens" -#: plinth/modules/wireguard/views.py:92 +#: plinth/modules/wireguard/views.py:199 +msgid "Session expired. Please try again." +msgstr "" + +#: plinth/modules/wireguard/views.py:202 +#, fuzzy +#| msgid "Client with public key already exists" +msgid "Client already exists" +msgstr "Ezzel a nyilvános kulccsal már létezik kliens" + +#: plinth/modules/wireguard/views.py:215 msgid "Allowed Client" msgstr "Engedélyezett kliens" -#: plinth/modules/wireguard/views.py:114 +#: plinth/modules/wireguard/views.py:237 msgid "Updated client." msgstr "Kliens frissítve." -#: plinth/modules/wireguard/views.py:119 +#: plinth/modules/wireguard/views.py:242 msgid "Modify Client" msgstr "Ügyfél módosítása" -#: plinth/modules/wireguard/views.py:152 +#: plinth/modules/wireguard/views.py:275 msgid "Delete Allowed Client" msgstr "Engedélyezett kliensek törlése" -#: plinth/modules/wireguard/views.py:161 +#: plinth/modules/wireguard/views.py:284 msgid "Client deleted." msgstr "Ügyfél törölve." -#: plinth/modules/wireguard/views.py:163 +#: plinth/modules/wireguard/views.py:286 msgid "Client not found" msgstr "Az ügyfél nem található" -#: plinth/modules/wireguard/views.py:173 +#: plinth/modules/wireguard/views.py:296 msgid "Added new server." msgstr "Új szerver hozzáadva." -#: plinth/modules/wireguard/views.py:194 +#: plinth/modules/wireguard/views.py:317 msgid "Connection to Server" msgstr "Kapcsolat a szerverhez" -#: plinth/modules/wireguard/views.py:212 +#: plinth/modules/wireguard/views.py:335 msgid "Updated server." msgstr "Szerver frissítve." -#: plinth/modules/wireguard/views.py:217 +#: plinth/modules/wireguard/views.py:340 msgid "Modify Connection to Server" msgstr "Szerverrel létesített kapcsolat módosítása" -#: plinth/modules/wireguard/views.py:255 +#: plinth/modules/wireguard/views.py:378 msgid "Delete Connection to Server" msgstr "Szerverrel létesített kapcsolat törlése" -#: plinth/modules/wireguard/views.py:275 +#: plinth/modules/wireguard/views.py:398 msgid "Server deleted." msgstr "Szerver törölve." -#: plinth/modules/wireguard/views.py:287 +#: plinth/modules/wireguard/views.py:410 #, fuzzy #| msgid "Password changed successfully." msgid "WireGuard server started successfully." msgstr "A jelszó módosítása sikeres." -#: plinth/modules/wireguard/views.py:291 +#: plinth/modules/wireguard/views.py:414 msgid "Failed to start WireGuard server: {}" msgstr "" @@ -11932,9 +12009,6 @@ msgstr "Gudzsaráti" #~ "Általános Nyilvános Licenc (3-as vagy újabb változat) alapján terjesztett " #~ "szabad szoftver." -#~ msgid "Source Code" -#~ msgstr "Forráskód" - #~ msgid "FreedomBox Foundation" #~ msgstr "FreedomBox Alapítvány" @@ -12531,9 +12605,6 @@ msgstr "Gudzsaráti" #~ msgid "OpenPGP User IDs" #~ msgstr "OpenPGP felhasználói azonosítók" -#~ msgid "Key Import Date" -#~ msgstr "Kulcs importálásának dátuma" - #~ msgid "SSH Key Type" #~ msgstr "SSH kulcs típusa" @@ -12689,11 +12760,6 @@ msgstr "Gudzsaráti" #~ msgid "Certificate path" #~ msgstr "Tanúsítvány állapot" -#, fuzzy -#~| msgid "Private repository" -#~ msgid "Private key path" -#~ msgstr "Privát tároló" - #, fuzzy #~| msgid "Enable damage" #~ msgid "Enabled aliases" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index c4378eb8e..f122e6dde 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian %(box_name)s wiki ." -#~ msgid "Source Code" -#~ msgstr "Kode Sumber" - #~ msgid "FreedomBox Foundation" #~ msgstr "FreedomBox Foundation" @@ -11373,9 +11447,6 @@ msgstr "Bahasa Gujarat" #~ msgid "OpenPGP User IDs" #~ msgstr "ID pengguna OpenPGP" -#~ msgid "Key Import Date" -#~ msgstr "Tanggal Impor Kunci" - #~ msgid "SSH Key Type" #~ msgstr "Tipe Kunci SSH" @@ -11470,11 +11541,6 @@ msgstr "Bahasa Gujarat" #~ msgid "Certificate path" #~ msgstr "Status Sertifikat" -#, fuzzy -#~| msgid "Private repository" -#~ msgid "Private key path" -#~ msgstr "Penyimpanan Pribadi" - #, fuzzy #~| msgid "Enable damage" #~ msgid "Enabled aliases" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 7964dd299..c1aa07698 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2026-05-05 17:11+0000\n" "Last-Translator: Pierfrancesco Passerini \n" "Language-Team: Italian ?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." -msgstr "Avrai bisogno di questa passkey per aggiungere di nuovo il dispositivo." +msgstr "" +"Avrai bisogno di questa passkey per aggiungere di nuovo il dispositivo." #: plinth/modules/users/templates/users_passkeys.html:152 msgid "Delete passkey" @@ -9961,6 +9964,7 @@ msgstr "Cancella Passkey" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:73 msgid "Cancel" msgstr "Cancella" @@ -10080,22 +10084,21 @@ msgid "Invalid key." msgstr "Chiave non valida." #: plinth/modules/wireguard/forms.py:63 -msgid "Enter a valid IPv4 address." +#, fuzzy +#| msgid "Enter a valid IPv4 address." +msgid "Not a valid IP address." msgstr "Inserisci un indirizzo IPv4 valido." -#: plinth/modules/wireguard/forms.py:65 -msgid "Enter a valid network prefix or net mask." -msgstr "Inserisci un prefisso di rete od una netmask validi." - -#: plinth/modules/wireguard/forms.py:71 +#: plinth/modules/wireguard/forms.py:69 #: plinth/modules/wireguard/templates/wireguard.html:29 #: plinth/modules/wireguard/templates/wireguard.html:57 -#: plinth/modules/wireguard/templates/wireguard.html:119 +#: plinth/modules/wireguard/templates/wireguard.html:125 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:24 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:24 msgid "Public Key" msgstr "Chiave pubblico" -#: plinth/modules/wireguard/forms.py:72 +#: plinth/modules/wireguard/forms.py:70 msgid "" "Public key of the peer. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." @@ -10103,11 +10106,11 @@ msgstr "" "Chiave pubblica del nodo. Esempio: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=" -#: plinth/modules/wireguard/forms.py:80 +#: plinth/modules/wireguard/forms.py:83 msgid "Endpoint of the server" msgstr "Endpoint del server" -#: plinth/modules/wireguard/forms.py:81 +#: plinth/modules/wireguard/forms.py:84 msgid "" "Domain name and port in the form \"ip:port\". Example: " "demo.wireguard.com:12912 ." @@ -10115,11 +10118,11 @@ msgstr "" "Nome di dominio e porta nel formato \"ip:porta\". Esempio: " "demo.wireguard.com:12912" -#: plinth/modules/wireguard/forms.py:86 +#: plinth/modules/wireguard/forms.py:89 msgid "Public key of the server" msgstr "Chiave pubblica del server" -#: plinth/modules/wireguard/forms.py:87 +#: plinth/modules/wireguard/forms.py:90 msgid "" "Provided by the server operator, a long string of characters. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." @@ -10127,17 +10130,24 @@ msgstr "" "Fornito dal gestore del server, una lunga sequenza di caratteri. Esempio: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=" -#: plinth/modules/wireguard/forms.py:92 +#: plinth/modules/wireguard/forms.py:95 msgid "Client IP address provided by server" msgstr "Indirizzo IP client fornito dal server" -#: plinth/modules/wireguard/forms.py:94 +#: plinth/modules/wireguard/forms.py:97 +#, fuzzy +#| msgid "" +#| "IP address assigned to this machine on the VPN after connecting to the " +#| "endpoint. This value is usually provided by the server operator. Example: " +#| "192.168.0.10. You can also specify the network. This will allow reaching " +#| "machines in the network. Examples: 10.68.12.43/24 or " +#| "10.68.12.43/255.255.255.0." msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " -"192.168.0.10. You can also specify the network. This will allow reaching " -"machines in the network. Examples: 10.68.12.43/24 or " -"10.68.12.43/255.255.255.0." +"192.168.0.10 or 2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also " +"specify the network. This will allow reaching machines in the network. " +"Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0." msgstr "" "Indirizzo IP assegnato a questa macchina sulla VPN dopo la connessione " "all'endpoint. Questo valore è generalmente fornito dal gestore del server. " @@ -10145,11 +10155,11 @@ msgstr "" "consentirà di raggiungere le macchine nella rete. Esempi: 10.68.12.43/24 o " "10.68.12.43/255.255.255.0." -#: plinth/modules/wireguard/forms.py:102 +#: plinth/modules/wireguard/forms.py:106 msgid "Private key of this machine" msgstr "Chiave privata di questa macchina" -#: plinth/modules/wireguard/forms.py:103 +#: plinth/modules/wireguard/forms.py:107 msgid "" "Optional. New public/private keys are generated if left blank. Public key " "can then be provided to the server. This is the recommended way. However, " @@ -10161,11 +10171,11 @@ msgstr "" "metodo consigliato. Tuttavia, alcuni gestori del server insistono per " "fornirla. Esempio: MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=" -#: plinth/modules/wireguard/forms.py:111 +#: plinth/modules/wireguard/forms.py:115 msgid "Pre-shared key" msgstr "Chiave condivisa" -#: plinth/modules/wireguard/forms.py:112 +#: plinth/modules/wireguard/forms.py:116 msgid "" "Optional. A shared secret key provided by the server to add an additional " "layer of security. Fill in only if provided. Example: " @@ -10175,11 +10185,11 @@ msgstr "" "ulteriore livello di sicurezza. Inserirla solo se vien fornita. Esempio: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=" -#: plinth/modules/wireguard/forms.py:118 +#: plinth/modules/wireguard/forms.py:122 msgid "Use this connection to send all outgoing traffic" msgstr "Usa questa connessione per veicolare tutto il traffico in uscita" -#: plinth/modules/wireguard/forms.py:120 +#: plinth/modules/wireguard/forms.py:124 msgid "Typically checked for a VPN service through which all traffic is sent." msgstr "" "Solitamente selezionato per un servizio VPN attraverso cui viene inviato " @@ -10228,7 +10238,7 @@ msgid "Allowed IPs" msgstr "IP autorizzati" #: plinth/modules/wireguard/templates/wireguard.html:59 -#: plinth/modules/wireguard/templates/wireguard.html:120 +#: plinth/modules/wireguard/templates/wireguard.html:126 msgid "Last Connected Time" msgstr "Data dell'ultima connessione" @@ -10238,47 +10248,58 @@ msgid "No peers configured to connect to this %(box_name)s yet." msgstr "Non ci sono nodi autorizzati a connettersi a %(box_name)s." #: plinth/modules/wireguard/templates/wireguard.html:88 -msgid "Add a new peer" +#, fuzzy +#| msgid "Add a new peer" +msgid "Auto add a new peer" msgstr "Aggiungi un nuovo nodo" #: plinth/modules/wireguard/templates/wireguard.html:92 -#: plinth/modules/wireguard/views.py:59 +msgid "Add Client Automatically" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:94 +msgid "Add a new peer" +msgstr "Aggiungi un nuovo nodo" + +#: plinth/modules/wireguard/templates/wireguard.html:98 +#: plinth/modules/wireguard/views.py:62 plinth/modules/wireguard/views.py:149 msgid "Add Allowed Client" msgstr "Aggiungi client autorizzato" -#: plinth/modules/wireguard/templates/wireguard.html:97 +#: plinth/modules/wireguard/templates/wireguard.html:103 msgid "WireGuard server not started yet." msgstr "Il server WireGuard non è stato ancora avviato." -#: plinth/modules/wireguard/templates/wireguard.html:101 -#: plinth/modules/wireguard/templates/wireguard.html:103 +#: plinth/modules/wireguard/templates/wireguard.html:107 +#: plinth/modules/wireguard/templates/wireguard.html:109 msgid "Start WireGuard Server" msgstr "Avvia WireGuard server" -#: plinth/modules/wireguard/templates/wireguard.html:109 +#: plinth/modules/wireguard/templates/wireguard.html:115 msgid "As a Client" msgstr "Come Client" -#: plinth/modules/wireguard/templates/wireguard.html:111 +#: plinth/modules/wireguard/templates/wireguard.html:117 #, python-format msgid "Servers that %(box_name)s will connect to:" msgstr "Server a cui %(box_name)s si connetterà:" -#: plinth/modules/wireguard/templates/wireguard.html:118 +#: plinth/modules/wireguard/templates/wireguard.html:124 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:23 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:20 msgid "Endpoint" msgstr "Endpoint" -#: plinth/modules/wireguard/templates/wireguard.html:142 +#: plinth/modules/wireguard/templates/wireguard.html:148 msgid "No connections to remote servers are configured yet." msgstr "Non sono configurate connessioni a server remoti." -#: plinth/modules/wireguard/templates/wireguard.html:152 +#: plinth/modules/wireguard/templates/wireguard.html:158 msgid "Add a new server" msgstr "Aggiungi un nuovo server" -#: plinth/modules/wireguard/templates/wireguard.html:156 -#: plinth/modules/wireguard/views.py:178 +#: plinth/modules/wireguard/templates/wireguard.html:162 +#: plinth/modules/wireguard/views.py:301 msgid "Add Connection to Server" msgstr "Aggiungi Connessione a Server" @@ -10290,6 +10311,60 @@ msgstr "Indirizzo IP che sarà assegnato al client" msgid "Add Client" msgstr "Aggiungere Client" +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:26 +#, fuzzy +#| msgid "Private key path" +msgid "Private Key" +msgstr "Percorso chiave privata" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:29 +msgid "Click to reveal" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:36 +#, fuzzy +#| msgid "Key Import Date" +msgid "Important:" +msgstr "Data Importazione Chiave" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:37 +msgid "Save the private key now. This page shows it only once!" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:41 +#, fuzzy +#| msgid "configuration failed" +msgid "Client configuration file" +msgstr "configurazione fallita" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:43 +msgid "" +"Download the configuration file (.conf) for manual import, or use the QR " +"code to import directly from your WireGuard mobile app." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:49 +#, fuzzy +#| msgid "warning" +msgid "Warning:" +msgstr "attenzione" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:50 +msgid "" +"Treat this QR code like a password. Anyone who scans it can gain VPN access " +"if the connection is enabled." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:60 +#, fuzzy +#| msgid "Download my profile" +msgid "Download config file" +msgstr "Download del profilo" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:65 +msgid "Show QR Code" +msgstr "" + #: plinth/modules/wireguard/templates/wireguard_delete_client.html:14 msgid "Are you sure that you want to delete this client?" msgstr "Sei sicuro di voler eliminare questo client?" @@ -10383,67 +10458,77 @@ msgstr "Indirizzo IP di questa macchina:" msgid "All outgoing traffic is sent using this connection:" msgstr "Tutto il traffico in uscita utilizza questo collegamento:" -#: plinth/modules/wireguard/views.py:54 +#: plinth/modules/wireguard/views.py:57 plinth/modules/wireguard/views.py:144 msgid "Added new client." msgstr "Client aggiunto." -#: plinth/modules/wireguard/views.py:79 plinth/modules/wireguard/views.py:138 +#: plinth/modules/wireguard/views.py:82 plinth/modules/wireguard/views.py:261 msgid "Client with public key already exists" msgstr "Il cliente con chiave pubblica esiste già" -#: plinth/modules/wireguard/views.py:92 +#: plinth/modules/wireguard/views.py:199 +msgid "Session expired. Please try again." +msgstr "" + +#: plinth/modules/wireguard/views.py:202 +#, fuzzy +#| msgid "Domain already exists." +msgid "Client already exists" +msgstr "Il dominio esiste già." + +#: plinth/modules/wireguard/views.py:215 msgid "Allowed Client" msgstr "Client autorizzato" -#: plinth/modules/wireguard/views.py:114 +#: plinth/modules/wireguard/views.py:237 msgid "Updated client." msgstr "Client aggiornato." -#: plinth/modules/wireguard/views.py:119 +#: plinth/modules/wireguard/views.py:242 msgid "Modify Client" msgstr "Modifica client" -#: plinth/modules/wireguard/views.py:152 +#: plinth/modules/wireguard/views.py:275 msgid "Delete Allowed Client" msgstr "Elimina client autorizzato" -#: plinth/modules/wireguard/views.py:161 +#: plinth/modules/wireguard/views.py:284 msgid "Client deleted." msgstr "Client cancellato." -#: plinth/modules/wireguard/views.py:163 +#: plinth/modules/wireguard/views.py:286 msgid "Client not found" msgstr "Cliente non trovato" -#: plinth/modules/wireguard/views.py:173 +#: plinth/modules/wireguard/views.py:296 msgid "Added new server." msgstr "Aggiunto nuovo server." -#: plinth/modules/wireguard/views.py:194 +#: plinth/modules/wireguard/views.py:317 msgid "Connection to Server" msgstr "Connessione al server" -#: plinth/modules/wireguard/views.py:212 +#: plinth/modules/wireguard/views.py:335 msgid "Updated server." msgstr "Aggiornato server." -#: plinth/modules/wireguard/views.py:217 +#: plinth/modules/wireguard/views.py:340 msgid "Modify Connection to Server" msgstr "Modifica Concessione a server" -#: plinth/modules/wireguard/views.py:255 +#: plinth/modules/wireguard/views.py:378 msgid "Delete Connection to Server" msgstr "Cancella Connessione a server" -#: plinth/modules/wireguard/views.py:275 +#: plinth/modules/wireguard/views.py:398 msgid "Server deleted." msgstr "Server cancellato." -#: plinth/modules/wireguard/views.py:287 +#: plinth/modules/wireguard/views.py:410 msgid "WireGuard server started successfully." msgstr "Il server WireGuard è stato correttamente avviato." -#: plinth/modules/wireguard/views.py:291 +#: plinth/modules/wireguard/views.py:414 msgid "Failed to start WireGuard server: {}" msgstr "Avvio del server WireGuard non riuscito: {}" @@ -11127,6 +11212,9 @@ msgstr "Prima della disinstallazione di {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enter a valid network prefix or net mask." +#~ msgstr "Inserisci un prefisso di rete od una netmask validi." + #~ msgid "Debian:" #~ msgstr "Debian:" @@ -11771,9 +11859,6 @@ msgstr "Gujarati" #~ msgid "OpenPGP User IDs" #~ msgstr "OpenPGP User ID" -#~ msgid "Key Import Date" -#~ msgstr "Data Importazione Chiave" - #~ msgid "SSH Key Type" #~ msgstr "Tipo Chiave SSH" @@ -11847,9 +11932,6 @@ msgstr "Gujarati" #~ msgid "Certificate path" #~ msgstr "Percorso del certificato" -#~ msgid "Private key path" -#~ msgstr "Percorso chiave privata" - #~ msgid "Enabled aliases" #~ msgstr "Alias abilitati" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index b9d00a971..d803a7060 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2025-10-24 16:02+0000\n" "Last-Translator: Jun Nogata \n" "Language-Team: Japanese \n" "Language-Team: Kannada \n" "Language-Team: Lithuanian \n" "Language-Team: Latvian \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Russian \n" "Language-Team: Sinhala \n" "Language-Team: Slovenian \n" "Language-Team: Albanian \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Tamil \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" "Language-Team: Vietnamese \n" @@ -2026,6 +2026,7 @@ msgid "Last update" msgstr "最后一次更新" #: plinth/modules/dynamicdns/templates/dynamicdns.html:29 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:22 msgid "IP Address" msgstr "IP 地址" @@ -5499,6 +5500,7 @@ msgstr "附近的无线网络" #: plinth/modules/networks/templates/connections_list.html:20 #: plinth/modules/networks/views.py:420 #: plinth/modules/wireguard/templates/wireguard_add_server.html:19 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:71 msgid "Add Connection" msgstr "添加连接" @@ -8927,6 +8929,7 @@ msgstr "删除 passkey" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:73 msgid "Cancel" msgstr "取消" @@ -9034,65 +9037,64 @@ msgid "Invalid key." msgstr "无效的密钥。" #: plinth/modules/wireguard/forms.py:63 -msgid "Enter a valid IPv4 address." +#, fuzzy +#| msgid "Enter a valid IPv4 address." +msgid "Not a valid IP address." msgstr "输入有效的 IPv4 地址。" -#: plinth/modules/wireguard/forms.py:65 -msgid "Enter a valid network prefix or net mask." -msgstr "" - -#: plinth/modules/wireguard/forms.py:71 +#: plinth/modules/wireguard/forms.py:69 #: plinth/modules/wireguard/templates/wireguard.html:29 #: plinth/modules/wireguard/templates/wireguard.html:57 -#: plinth/modules/wireguard/templates/wireguard.html:119 +#: plinth/modules/wireguard/templates/wireguard.html:125 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:24 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:24 msgid "Public Key" msgstr "公钥" -#: plinth/modules/wireguard/forms.py:72 +#: plinth/modules/wireguard/forms.py:70 msgid "" "Public key of the peer. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:80 +#: plinth/modules/wireguard/forms.py:83 msgid "Endpoint of the server" msgstr "" -#: plinth/modules/wireguard/forms.py:81 +#: plinth/modules/wireguard/forms.py:84 msgid "" "Domain name and port in the form \"ip:port\". Example: " "demo.wireguard.com:12912 ." msgstr "" -#: plinth/modules/wireguard/forms.py:86 +#: plinth/modules/wireguard/forms.py:89 msgid "Public key of the server" msgstr "服务器的公钥" -#: plinth/modules/wireguard/forms.py:87 +#: plinth/modules/wireguard/forms.py:90 msgid "" "Provided by the server operator, a long string of characters. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:92 +#: plinth/modules/wireguard/forms.py:95 msgid "Client IP address provided by server" msgstr "服务器提供的客户端 IP 地址" -#: plinth/modules/wireguard/forms.py:94 +#: plinth/modules/wireguard/forms.py:97 msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " -"192.168.0.10. You can also specify the network. This will allow reaching " -"machines in the network. Examples: 10.68.12.43/24 or " -"10.68.12.43/255.255.255.0." +"192.168.0.10 or 2a03:7c80:4b2c:91a2:5d41:ffee:9b82:7c17. You can also " +"specify the network. This will allow reaching machines in the network. " +"Examples: 10.68.12.43/24 or 10.68.12.43/255.255.255.0." msgstr "" -#: plinth/modules/wireguard/forms.py:102 +#: plinth/modules/wireguard/forms.py:106 msgid "Private key of this machine" msgstr "" -#: plinth/modules/wireguard/forms.py:103 +#: plinth/modules/wireguard/forms.py:107 msgid "" "Optional. New public/private keys are generated if left blank. Public key " "can then be provided to the server. This is the recommended way. However, " @@ -9100,22 +9102,22 @@ msgid "" "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ." msgstr "" -#: plinth/modules/wireguard/forms.py:111 +#: plinth/modules/wireguard/forms.py:115 msgid "Pre-shared key" msgstr "" -#: plinth/modules/wireguard/forms.py:112 +#: plinth/modules/wireguard/forms.py:116 msgid "" "Optional. A shared secret key provided by the server to add an additional " "layer of security. Fill in only if provided. Example: " "MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=." msgstr "" -#: plinth/modules/wireguard/forms.py:118 +#: plinth/modules/wireguard/forms.py:122 msgid "Use this connection to send all outgoing traffic" msgstr "" -#: plinth/modules/wireguard/forms.py:120 +#: plinth/modules/wireguard/forms.py:124 msgid "Typically checked for a VPN service through which all traffic is sent." msgstr "" @@ -9162,7 +9164,7 @@ msgid "Allowed IPs" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:59 -#: plinth/modules/wireguard/templates/wireguard.html:120 +#: plinth/modules/wireguard/templates/wireguard.html:126 msgid "Last Connected Time" msgstr "上次连接时间" @@ -9172,47 +9174,58 @@ msgid "No peers configured to connect to this %(box_name)s yet." msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:88 +#, fuzzy +#| msgid "Added new server." +msgid "Auto add a new peer" +msgstr "添加新服务器。" + +#: plinth/modules/wireguard/templates/wireguard.html:92 +msgid "Add Client Automatically" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard.html:94 msgid "Add a new peer" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:92 -#: plinth/modules/wireguard/views.py:59 +#: plinth/modules/wireguard/templates/wireguard.html:98 +#: plinth/modules/wireguard/views.py:62 plinth/modules/wireguard/views.py:149 msgid "Add Allowed Client" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:97 +#: plinth/modules/wireguard/templates/wireguard.html:103 msgid "WireGuard server not started yet." msgstr "WireGuard 服务器还未启动。" -#: plinth/modules/wireguard/templates/wireguard.html:101 -#: plinth/modules/wireguard/templates/wireguard.html:103 +#: plinth/modules/wireguard/templates/wireguard.html:107 +#: plinth/modules/wireguard/templates/wireguard.html:109 msgid "Start WireGuard Server" msgstr "启动 WireGuard 服务器" -#: plinth/modules/wireguard/templates/wireguard.html:109 +#: plinth/modules/wireguard/templates/wireguard.html:115 msgid "As a Client" msgstr "作为客户端" -#: plinth/modules/wireguard/templates/wireguard.html:111 +#: plinth/modules/wireguard/templates/wireguard.html:117 #, python-format msgid "Servers that %(box_name)s will connect to:" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:118 +#: plinth/modules/wireguard/templates/wireguard.html:124 +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:23 #: plinth/modules/wireguard/templates/wireguard_delete_server.html:20 msgid "Endpoint" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:142 +#: plinth/modules/wireguard/templates/wireguard.html:148 msgid "No connections to remote servers are configured yet." msgstr "尚未配置到远程服务器的连接。" -#: plinth/modules/wireguard/templates/wireguard.html:152 +#: plinth/modules/wireguard/templates/wireguard.html:158 msgid "Add a new server" msgstr "" -#: plinth/modules/wireguard/templates/wireguard.html:156 -#: plinth/modules/wireguard/views.py:178 +#: plinth/modules/wireguard/templates/wireguard.html:162 +#: plinth/modules/wireguard/views.py:301 msgid "Add Connection to Server" msgstr "添加到服务器的连接" @@ -9224,6 +9237,62 @@ msgstr "" msgid "Add Client" msgstr "添加客户端" +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:26 +#, fuzzy +#| msgid "Create User" +msgid "Private Key" +msgstr "创建用户" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:29 +msgid "Click to reveal" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:36 +#, fuzzy +#| msgid "Key Import Date" +msgid "Important:" +msgstr "密钥导入日期" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:37 +msgid "Save the private key now. This page shows it only once!" +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:41 +#, fuzzy +#| msgid "configuration failed" +msgid "Client configuration file" +msgstr "配置失败" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:43 +msgid "" +"Download the configuration file (.conf) for manual import, or use the QR " +"code to import directly from your WireGuard mobile app." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:49 +#, fuzzy +#| msgid "warning" +msgid "Warning:" +msgstr "警告" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:50 +msgid "" +"Treat this QR code like a password. Anyone who scans it can gain VPN access " +"if the connection is enabled." +msgstr "" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:60 +#, fuzzy +#| msgid "Download my profile" +msgid "Download config file" +msgstr "下载我的配置文件" + +#: plinth/modules/wireguard/templates/wireguard_auto_add_client.html:65 +#, fuzzy +#| msgid "Source Code" +msgid "Show QR Code" +msgstr "源代码" + #: plinth/modules/wireguard/templates/wireguard_delete_client.html:14 msgid "Are you sure that you want to delete this client?" msgstr "你确定要删除此客户端吗?" @@ -9312,67 +9381,77 @@ msgstr "" msgid "All outgoing traffic is sent using this connection:" msgstr "" -#: plinth/modules/wireguard/views.py:54 +#: plinth/modules/wireguard/views.py:57 plinth/modules/wireguard/views.py:144 msgid "Added new client." msgstr "" -#: plinth/modules/wireguard/views.py:79 plinth/modules/wireguard/views.py:138 +#: plinth/modules/wireguard/views.py:82 plinth/modules/wireguard/views.py:261 msgid "Client with public key already exists" msgstr "已存在有公钥的客户端" -#: plinth/modules/wireguard/views.py:92 +#: plinth/modules/wireguard/views.py:199 +msgid "Session expired. Please try again." +msgstr "" + +#: plinth/modules/wireguard/views.py:202 +#, fuzzy +#| msgid "Domain already exists." +msgid "Client already exists" +msgstr "域名已存在。" + +#: plinth/modules/wireguard/views.py:215 msgid "Allowed Client" msgstr "允许的客户端" -#: plinth/modules/wireguard/views.py:114 +#: plinth/modules/wireguard/views.py:237 msgid "Updated client." msgstr "已更新客户端。" -#: plinth/modules/wireguard/views.py:119 +#: plinth/modules/wireguard/views.py:242 msgid "Modify Client" msgstr "更改客户端" -#: plinth/modules/wireguard/views.py:152 +#: plinth/modules/wireguard/views.py:275 msgid "Delete Allowed Client" msgstr "删除允许的客户端" -#: plinth/modules/wireguard/views.py:161 +#: plinth/modules/wireguard/views.py:284 msgid "Client deleted." msgstr "客户端已删除。" -#: plinth/modules/wireguard/views.py:163 +#: plinth/modules/wireguard/views.py:286 msgid "Client not found" msgstr "未找到客户端" -#: plinth/modules/wireguard/views.py:173 +#: plinth/modules/wireguard/views.py:296 msgid "Added new server." msgstr "添加新服务器。" -#: plinth/modules/wireguard/views.py:194 +#: plinth/modules/wireguard/views.py:317 msgid "Connection to Server" msgstr "连接到服务器" -#: plinth/modules/wireguard/views.py:212 +#: plinth/modules/wireguard/views.py:335 msgid "Updated server." msgstr "已更新服务器。" -#: plinth/modules/wireguard/views.py:217 +#: plinth/modules/wireguard/views.py:340 msgid "Modify Connection to Server" msgstr "修改到服务器的连接" -#: plinth/modules/wireguard/views.py:255 +#: plinth/modules/wireguard/views.py:378 msgid "Delete Connection to Server" msgstr "删除与服务器的连接" -#: plinth/modules/wireguard/views.py:275 +#: plinth/modules/wireguard/views.py:398 msgid "Server deleted." msgstr "服务器已删除。" -#: plinth/modules/wireguard/views.py:287 +#: plinth/modules/wireguard/views.py:410 msgid "WireGuard server started successfully." msgstr "WireGuard 服务器启动成功。" -#: plinth/modules/wireguard/views.py:291 +#: plinth/modules/wireguard/views.py:414 msgid "Failed to start WireGuard server: {}" msgstr "" @@ -10207,9 +10286,6 @@ msgstr "古吉拉特语" #~ "此页面是 %(box_name)s Web 接口的一部分。%(box_name)s 是自由软件,以 GNU " #~ "Affero 通用许可证第 3 版或更高版发布。" -#~ msgid "Source Code" -#~ msgstr "源代码" - #~ msgid "FreedomBox Foundation" #~ msgstr "FreedomBox 基金会" @@ -10596,9 +10672,6 @@ msgstr "古吉拉特语" #~ msgid "OpenPGP User IDs" #~ msgstr "OpenPGP 用户ID" -#~ msgid "Key Import Date" -#~ msgstr "密钥导入日期" - #~ msgid "SSH Key Type" #~ msgstr "SSH 密钥类型" @@ -10693,11 +10766,6 @@ msgstr "古吉拉特语" #~ msgid "Certificate path" #~ msgstr "证书状态" -#, fuzzy -#~| msgid "Create User" -#~ msgid "Private key path" -#~ msgstr "创建用户" - #, fuzzy #~| msgid "Enable damage" #~ msgid "Enabled aliases" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index c1c38042b..b5e650684 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"POT-Creation-Date: 2026-06-02 00:51+0000\n" "PO-Revision-Date: 2025-02-07 12:01+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional Han script) Date: Mon, 1 Jun 2026 21:17:30 -0400 Subject: [PATCH 33/34] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/ReleaseNotes.raw.wiki | 17 +++++++++++++++++ doc/manual/es/ReleaseNotes.raw.wiki | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index ece424158..435cdd125 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,23 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 26.9 (2026-06-01) == + +=== Highlights === + + * wireguard: Auto-generate client keypairs + * wireguard: Provide download and QR code for client config + +=== Other Changes === + + * bepasty: Don't remove old system user and group + * debian: Install and use sysusers.d/tmpfiles.d config files + * debian: Stop deleting system user on remove/purge + * infinoted: Use systemd-sysusers for creating a system user account + * locale: Update translations for Dutch, German + * syncthing: Use systemd-sysusers for creating a system user account + * wireguard: Enable !FreedomBox to connect to a server using IPv6 + == FreedomBox 26.8 (2026-05-11) == * locale: Update translations for German, Italian diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index ece424158..435cdd125 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,23 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 26.9 (2026-06-01) == + +=== Highlights === + + * wireguard: Auto-generate client keypairs + * wireguard: Provide download and QR code for client config + +=== Other Changes === + + * bepasty: Don't remove old system user and group + * debian: Install and use sysusers.d/tmpfiles.d config files + * debian: Stop deleting system user on remove/purge + * infinoted: Use systemd-sysusers for creating a system user account + * locale: Update translations for Dutch, German + * syncthing: Use systemd-sysusers for creating a system user account + * wireguard: Enable !FreedomBox to connect to a server using IPv6 + == FreedomBox 26.8 (2026-05-11) == * locale: Update translations for German, Italian From 2590661fc80e90d3913ddac88c1bf6e45a6b63c9 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 1 Jun 2026 21:20:28 -0400 Subject: [PATCH 34/34] Release v26.9 to unstable Signed-off-by: James Valleroy --- debian/changelog | 29 +++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 0c4d2bd43..6a6a59ec8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,32 @@ +freedombox (26.9) unstable; urgency=medium + + [ Sunil Mohan Adapa ] + * syncthing: Use systemd-sysusers for creating a system user account + * infinoted: Use systemd-sysusers for creating a system user account + * bepasty: Don't remove old system user and group + + [ Luca Boccassi ] + * Stop deleting system user on remove/purge + * Install and use sysusers.d/tmpfiles.d config files + + [ Hosted Weblate user 151773 ] + * Translated using Weblate (German) + + [ jay ] + * Translated using Weblate (Dutch) + + [ Frederico Gomes ] + * wireguard: Auto-generate client keypairs + * wireguard: Provide download and QR code for client config + * wireguard: Enable connection to a server using IPv6 + + [ James Valleroy ] + * debian/control: Add !nocheck for python3-segno + * locale: Update translation strings + * doc: Fetch latest manual + + -- James Valleroy Mon, 01 Jun 2026 21:17:46 -0400 + freedombox (26.8) unstable; urgency=medium [ Pierfrancesco Passerini ] diff --git a/plinth/__init__.py b/plinth/__init__.py index f2decbcfa..89fd60a6b 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '26.8' +__version__ = '26.9'