From e5a6205dece4279350db050a8a9567a5521df26f Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 27 Dec 2022 16:25:10 +0000 Subject: [PATCH 01/13] Translated using Weblate (Spanish) Currently translated at 100.0% (1484 of 1484 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 143 +++++++++++-------------- 1 file changed, 65 insertions(+), 78 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 6a547410b..1eaa92594 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-19 20:15-0500\n" -"PO-Revision-Date: 2022-09-14 17:19+0000\n" -"Last-Translator: ikmaak \n" +"PO-Revision-Date: 2022-12-28 16:51+0000\n" +"Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\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 4.14.1-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -54,17 +54,17 @@ msgstr "No se pudo conectar a {host}:{port}" #: plinth/forms.py:36 msgid "Backup app before uninstall" -msgstr "" +msgstr "Copia de seguridad de la aplicación antes de desinstalarla" #: plinth/forms.py:37 msgid "Restoring from the backup will restore app data." msgstr "" +"La restauración desde la copia de seguridad restaurará los datos de la " +"aplicación." #: plinth/forms.py:39 -#, fuzzy -#| msgid "Repository not found" msgid "Repository to backup to" -msgstr "Repositorio no encontrado" +msgstr "Repositorio en el que hacer la copia de seguridad" #: plinth/forms.py:56 msgid "Select a domain name to be used with this application" @@ -1559,7 +1559,7 @@ msgid "" " " msgstr "" "\n" -" App: %(app_name)s\n" +" Aplicación: %(app_name)s\n" " " #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 @@ -1919,7 +1919,7 @@ msgstr "Secreto compartido para resolver contraseñas para el servidor TURN." #: plinth/modules/ejabberd/manifest.py:10 msgid "Conversations" -msgstr "Conversations" +msgstr "Conversaciones" #: plinth/modules/ejabberd/manifest.py:24 msgid "Xabber" @@ -2130,7 +2130,7 @@ msgstr "TTL" #: plinth/modules/email/templates/email.html:37 msgid "Class" -msgstr "Class" +msgstr "Clase" #: plinth/modules/email/templates/email.html:39 msgid "Priority" @@ -4965,30 +4965,24 @@ msgid "Profile" msgstr "Perfil" #: plinth/modules/openvpn/templates/openvpn.html:15 -#, fuzzy, python-format -#| msgid "" -#| "To connect to %(box_name)s's VPN, you need to download a profile and feed " -#| "it to an OpenVPN client on your mobile or desktop machine. OpenVPN " -#| "Clients are available for most platforms. Click \"Learn more...\" above " -#| "for recommended clients and instructions on how to configure them." +#, python-format msgid "" "To connect to %(box_name)s's VPN, you need to download a profile and feed it " "to an OpenVPN client on your mobile or desktop machine. OpenVPN Clients are " "available for most platforms. Click \"Learn more...\" above for recommended " "clients and instructions on how to configure them." msgstr "" -"Para conectar a la VPN de %(box_name)s necesita descargar un perfil y " -"añadirlo a un cliente OpenVPN en su ordenador de escritorio o móvil. Hay " -"clientes OpenVPN para la mayoría de las plataformas. Haga clic en " -"\"Aprender más...\" para información sobre los clientes recomendados y cómo " -"configurarlos." +"Para conectarse a la VPN de %(box_name)s, debe descargar un archivo de " +"configuración y proporcionarlo al cliente OpenVPN en su computadora de " +"escritorio o móvil. Los clientes de OpenVPN están disponibles para la " +"mayoría de las plataformas. Para ver los clientes recomendados y las " +"instrucciones de configuración, haga clic en \"Más información...\" arriba." #: plinth/modules/openvpn/templates/openvpn.html:24 -#, fuzzy, python-format -#| msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." +#, python-format msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." msgstr "" -"El perfil es específico de cada usuaria/o de %(box_name)s. Manténgalo en " +"El perfil es específico para cada usuario de %(box_name)s. Manténgalo en " "secreto." #: plinth/modules/openvpn/templates/openvpn.html:34 @@ -5300,25 +5294,24 @@ msgstr "Apagar ahora" #: plinth/modules/privacy/__init__.py:14 msgid "Manage system-wide privacy settings." -msgstr "" +msgstr "Gestionar la configuración de la privacidad de todo el sistema." #: plinth/modules/privacy/__init__.py:31 plinth/modules/privacy/__init__.py:63 -#, fuzzy -#| msgid "Privoxy" msgid "Privacy" -msgstr "Privoxy" +msgstr "Privacidad" #: plinth/modules/privacy/__init__.py:61 msgid "Please update privacy settings to match your preferences." -msgstr "" +msgstr "Por favor, compruebe la configuración de privacidad." #: plinth/modules/privacy/__init__.py:66 msgid "Review privacy setting" -msgstr "" +msgstr "Revisar la configuración de la privacidad" #: plinth/modules/privacy/forms.py:15 msgid "Periodically submit a list of apps used (suggested)" msgstr "" +"Presentar periódicamente una lista de las aplicaciones utilizadas (sugerido)" #: plinth/modules/privacy/forms.py:17 #, python-brace-format @@ -5330,6 +5323,13 @@ msgid "" "target=\"_blank\">popcon.debian.org. Submission happens over the Tor " "network for additional anonymity if Tor app is enabled." msgstr "" +"Ayude a los desarrolladores de Debian/{box_name} participando en el programa " +"de encuestas del paquete Popularity Contest. Si está habilitado, una lista " +"de las aplicaciones utilizadas en este sistema se envía de forma anónima a " +"Debian cada semana. Las estadísticas de los datos recopilados están " +"disponibles públicamente en popcon.debian.org. La transmisión se realiza a través de la " +"red Tor para mayor anonimato cuando la aplicación Tor está habilitada." #: plinth/modules/privoxy/__init__.py:23 msgid "" @@ -6434,10 +6434,8 @@ msgid "Secure Shell (SSH) Server" msgstr "Servidor de intérprete de órdenes seguro (SSH)" #: plinth/modules/ssh/__init__.py:61 -#, fuzzy -#| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" -msgstr "Intérprete de órdenes seguro (SSH)" +msgstr "Inicio de sesión remoto mediante Secure Shell (SSH)" #: plinth/modules/ssh/forms.py:13 msgid "Disable password authentication" @@ -6455,7 +6453,7 @@ msgstr "" #: plinth/modules/ssh/forms.py:21 msgid "Allow all users to login remotely" -msgstr "" +msgstr "Permitir a todos los usuarios iniciar sesión de forma remota" #: plinth/modules/ssh/forms.py:22 msgid "" @@ -6463,6 +6461,9 @@ msgid "" "disabled, only users of groups root, admin and freedombox-ssh can login via " "SSH." msgstr "" +"Permita que todos los usuarios que tengan una cuenta válida inicien sesión " +"de forma remota a través de SSH. Si está deshabilitado, solo los usuarios " +"root, admin y freedombox-ssh pueden iniciar sesión a través de SSH." #: plinth/modules/ssh/templates/ssh.html:11 msgid "Server Fingerprints" @@ -6953,16 +6954,13 @@ msgid "Ports" msgstr "Puertos" #: plinth/modules/tor/views.py:53 -#, fuzzy -#| msgid "An error occurred during configuration." msgid "Updating configuration" -msgstr "Ha habido un error en la configuración." +msgstr "Actualizando la configuración" #: plinth/modules/tor/views.py:70 -#, fuzzy, python-brace-format -#| msgid "Error updating app: {error}" +#, python-brace-format msgid "Error configuring app: {error}" -msgstr "Error al actualizar la app: {error}" +msgstr "Error al configurar la aplicación: {error}" #: plinth/modules/transmission/__init__.py:24 msgid "Transmission is a BitTorrent client with a web interface." @@ -7275,22 +7273,20 @@ msgid "Show recent update logs" msgstr "Mostrar los registros de las actualizaciones recientes" #: plinth/modules/upgrades/templates/upgrades_configure.html:138 -#, fuzzy -#| msgid "Distribution upgrade enabled" msgid "Test Distribution Upgrade" -msgstr "Actualización automática de distibución activada" +msgstr "Prueba de la actualización de la distribución" #: plinth/modules/upgrades/templates/upgrades_configure.html:140 msgid "" "This will attempt to upgrade the system from stable to testing. It " "is meant only for development use." msgstr "" +"Esto intentará actualizar el sistema de estable a prueba. Está " +"destinado únicamente a fines de desarrollo." #: plinth/modules/upgrades/templates/upgrades_configure.html:150 -#, fuzzy -#| msgid "Distribution upgrade enabled" msgid "Test distribution upgrade now" -msgstr "Actualización automática de distibución activada" +msgstr "Pruebe la actualización de distribución ahora" #: plinth/modules/upgrades/views.py:71 #, python-brace-format @@ -7326,10 +7322,8 @@ msgid "Frequent feature updates activated." msgstr "Las actualizaciones funcionales frecuentes están activadas." #: plinth/modules/upgrades/views.py:224 -#, fuzzy -#| msgid "Distribution upgrade enabled" msgid "Starting distribution upgrade test." -msgstr "Actualización automática de distibución activada" +msgstr "Comenzando la prueba de la actualización de la distribución." #: plinth/modules/users/__init__.py:28 msgid "" @@ -7527,13 +7521,7 @@ msgid "The following administrator accounts exist in the system." msgstr "La siguiente cuenta de administración existe en el sistema." #: plinth/modules/users/templates/users_firstboot.html:50 -#, fuzzy, python-format -#| msgid "" -#| "Delete these accounts from command line and refresh the page to create an " -#| "account that is usable with %(box_name)s. On the command line run the " -#| "command 'echo \"{password}\" | /usr/share/plinth/actions/users remove-" -#| "user {username}'. If an account is already usable with %(box_name)s, skip " -#| "this step." +#, python-format msgid "" "Delete these accounts from command line and refresh the page to create an " "account that is usable with %(box_name)s. On the command line run the " @@ -7541,11 +7529,12 @@ msgid "" "sudo /usr/share/plinth/actions/actions users remove_user\". If an account is " "already usable with %(box_name)s, skip this step." msgstr "" -"Si ya hay una cuenta usable con %(box_name)s sáltese este paso: Si no, " -"elimine estas cuentas desde la línea de órdenes y refresque la página para " -"crear una cuenta usable con %(box_name)s. Ejecute la órden 'echo " -"\"{password}\" | /usr/share/plinth/actions/users remove-user {username}' en " -"la línea de órdenes." +"Elimine estas cuentas desde la línea de comando y actualice la página para " +"crear una cuenta que se pueda usar con %(box_name)s. Desde la línea de " +"comando, ejecute el comando: \"echo '{\"args\": [\"NOMBRE DE USUARIO\", " +"\"CONTRASEÑA\"], \"kwargs\": {}}' | sudo /usr/share/plinth/actions/actions " +"users remove_user\" . Si una cuenta ya se puede usar con %(box_name)s, omita " +"este paso." #: plinth/modules/users/templates/users_list.html:11 #: plinth/modules/users/views.py:64 @@ -8177,22 +8166,18 @@ msgid "Uninstalling app" msgstr "Instalando app" #: plinth/setup.py:123 -#, fuzzy, python-brace-format -#| msgid "Error installing app: {string} {details}" +#, python-brace-format msgid "Error uninstalling app: {string} {details}" -msgstr "Error al instalar la app: {string} {details}" +msgstr "Error al desinstalar la aplicación: {string} {details}" #: plinth/setup.py:129 -#, fuzzy, python-brace-format -#| msgid "Error installing app: {error}" +#, python-brace-format msgid "Error uninstalling app: {error}" -msgstr "Error al instalar la app: {error}" +msgstr "Error desinstalando la aplicación: {error}" #: plinth/setup.py:132 -#, fuzzy -#| msgid "App installed." msgid "App uninstalled." -msgstr "App instalada." +msgstr "Aplicación desinstalada." #: plinth/setup.py:452 msgid "Updating app packages" @@ -8259,6 +8244,9 @@ msgid "" "FreedomBox is a personal server designed for privacy and data ownership. It " "is free software that lets you install and manage server apps with ease." msgstr "" +"FreedomBox es un servidor personal diseñado para la privacidad y la " +"propiedad de los datos. Es un software gratuito que te permite instalar y " +"gestionar aplicaciones de un servidor con facilidad." #: plinth/templates/base.html:110 msgid " Home" @@ -8556,26 +8544,25 @@ msgstr "Actualización" #: plinth/templates/toolbar.html:39 plinth/templates/toolbar.html:40 #: plinth/templates/uninstall.html:36 -#, fuzzy -#| msgid "Install" msgid "Uninstall" -msgstr "Instalar" +msgstr "Desinstalar" #: plinth/templates/uninstall.html:11 -#, fuzzy, python-format -#| msgid "Edit User %(username)s" +#, python-format msgid "Uninstall App %(app_name)s?" -msgstr "Editar el usuario %(username)s" +msgstr "¿Desinstalar la aplicación %(app_name)s?" #: plinth/templates/uninstall.html:17 msgid "Uninstalling an app is an exprimental feature." -msgstr "" +msgstr "Desinstalar una aplicación es una función experimental." #: plinth/templates/uninstall.html:23 msgid "" "All app data and configuration will be permanently lost. App may be " "installed freshly again." msgstr "" +"Todos los datos de la aplicación y la configuración se perderán " +"permanentemente. La aplicación se puede instalar de nuevo." #: plinth/views.py:221 msgid "Setting unchanged" @@ -8584,7 +8571,7 @@ msgstr "Configuración sin cambio" #: plinth/views.py:401 #, python-brace-format msgid "before uninstall of {app_id}" -msgstr "" +msgstr "antes de desinstalar {app_id}" #: plinth/web_framework.py:114 msgid "Gujarati" From d3d7e233e3a5bc3c32356b66990f9be5d48158a2 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 28 Dec 2022 11:19:11 -0500 Subject: [PATCH 02/13] janus: Allow upgrade to 1.1 Closes: #2303. Tests: - In testing container, install Janus. - Downgrade janus package to 1.0.1-1. - Manually re-run janus setup action. - Run "apt update". - janus is upgraded to 1.1.1-1, and rtp_port_range is set in /etc/janus/janus.jcfg. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/janus/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/janus/__init__.py b/plinth/modules/janus/__init__.py index 734fb7368..eb18c2a42 100644 --- a/plinth/modules/janus/__init__.py +++ b/plinth/modules/janus/__init__.py @@ -97,9 +97,9 @@ class JanusApp(app_module.App): if 'janus' not in packages: return False - # Allow upgrades within 1.0.* + # Allow upgrades within 1.0.* and 1.1.* package = packages['janus'] - if Version(package['new_version']) > Version('1.1~'): + if Version(package['new_version']) > Version('1.2~'): return False install(['janus'], force_configuration='new') From b94e1ea596ba2f7de46f334a2e9083301f378a5c Mon Sep 17 00:00:00 2001 From: Veiko Aasa Date: Wed, 28 Dec 2022 16:54:44 +0200 Subject: [PATCH 03/13] gitweb: Run git commands as a web user Fixes #2306. Tested that all the gitweb tests pass in Debian stable and testing containers. Signed-off-by: Veiko Aasa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/gitweb/__init__.py | 7 ++++--- plinth/modules/gitweb/forms.py | 3 ++- plinth/modules/gitweb/manifest.py | 1 + plinth/modules/gitweb/privileged.py | 12 +++++++----- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/plinth/modules/gitweb/__init__.py b/plinth/modules/gitweb/__init__.py index ead2bdc3b..0254ef98c 100644 --- a/plinth/modules/gitweb/__init__.py +++ b/plinth/modules/gitweb/__init__.py @@ -15,7 +15,7 @@ from plinth.package import Packages from . import manifest, privileged from .forms import is_repo_url -from .manifest import GIT_REPO_PATH +from .manifest import GIT_REPO_PATH, REPO_DIR_OWNER _description = [ _('Git is a distributed version-control system for tracking changes in ' @@ -213,7 +213,7 @@ def get_repo_list(): def repo_info(repo): """Get information about repository.""" - info = privileged.repo_info(repo) + info = privileged.repo_info(repo, _run_as_user=REPO_DIR_OWNER) if info['access'] == 'private': info['is_private'] = True else: @@ -244,4 +244,5 @@ def edit_repo(form_initial, form_cleaned): privileged.set_repo_access(repo, 'public') if form_cleaned['default_branch'] != form_initial['default_branch']: - privileged.set_default_branch(repo, form_cleaned['default_branch']) + privileged.set_default_branch(repo, form_cleaned['default_branch'], + _run_as_user=REPO_DIR_OWNER) diff --git a/plinth/modules/gitweb/forms.py b/plinth/modules/gitweb/forms.py index 76ba8a314..b47ef9e5a 100644 --- a/plinth/modules/gitweb/forms.py +++ b/plinth/modules/gitweb/forms.py @@ -14,11 +14,12 @@ from django.utils.translation import gettext_lazy as _ from plinth.modules import gitweb from . import privileged +from .manifest import REPO_DIR_OWNER def _get_branches(repo): """Get all the branches in the repository.""" - branch_data = privileged.get_branches(repo) + branch_data = privileged.get_branches(repo, _run_as_user=REPO_DIR_OWNER) default_branch = branch_data['default_branch'] branches = branch_data['branches'] diff --git a/plinth/modules/gitweb/manifest.py b/plinth/modules/gitweb/manifest.py index 92847f90d..cb83f8353 100644 --- a/plinth/modules/gitweb/manifest.py +++ b/plinth/modules/gitweb/manifest.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ CONFIG_FILE = '/etc/gitweb-freedombox.conf' GIT_REPO_PATH = '/var/lib/git' +REPO_DIR_OWNER = 'www-data' clients = [ { diff --git a/plinth/modules/gitweb/privileged.py b/plinth/modules/gitweb/privileged.py index 3bb213eed..9717ff616 100644 --- a/plinth/modules/gitweb/privileged.py +++ b/plinth/modules/gitweb/privileged.py @@ -13,7 +13,7 @@ from typing import Any, Optional from plinth import action_utils from plinth.actions import privileged from plinth.modules.gitweb.forms import RepositoryValidator, get_name_from_url -from plinth.modules.gitweb.manifest import GIT_REPO_PATH +from plinth.modules.gitweb.manifest import GIT_REPO_PATH, REPO_DIR_OWNER logger = logging.getLogger(__name__) @@ -166,8 +166,9 @@ def _clone_repo(url: str, description: str, owner: str, keep_ownership: bool): shutil.rmtree(repo_temp_path) if not keep_ownership: - subprocess.check_call(['chown', '-R', 'www-data:www-data', repo], - cwd=GIT_REPO_PATH) + subprocess.check_call( + ['chown', '-R', f'{REPO_DIR_OWNER}:{REPO_DIR_OWNER}', repo], + cwd=GIT_REPO_PATH) _set_repo_description(repo, description) _set_repo_owner(repo, owner) @@ -180,8 +181,9 @@ def _create_repo(repo: str, description: str, owner: str, is_private: bool, subprocess.check_call(['git', 'init', '-q', '--bare', repo], cwd=GIT_REPO_PATH) if not keep_ownership: - subprocess.check_call(['chown', '-R', 'www-data:www-data', repo], - cwd=GIT_REPO_PATH) + subprocess.check_call( + ['chown', '-R', f'{REPO_DIR_OWNER}:{REPO_DIR_OWNER}', repo], + cwd=GIT_REPO_PATH) _set_repo_description(repo, description) _set_repo_owner(repo, owner) if is_private: From 75031dba4023c54c67f93545ac5d8c033fab6aec Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 29 Dec 2022 10:45:35 +0000 Subject: [PATCH 04/13] Translated using Weblate (Galician) Currently translated at 1.6% (24 of 1484 strings) --- plinth/locale/gl/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 2f6589122..1fc3fb53b 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-19 20:15-0500\n" -"PO-Revision-Date: 2021-01-18 12:32+0000\n" -"Last-Translator: ikmaak \n" +"PO-Revision-Date: 2022-12-30 10:51+0000\n" +"Last-Translator: gallegonovato \n" "Language-Team: Galician \n" "Language: gl\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 4.5-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -786,7 +786,7 @@ msgstr "" #: plinth/modules/dynamicdns/forms.py:91 plinth/modules/networks/forms.py:213 #: plinth/modules/shadowsocks/forms.py:44 msgid "Password" -msgstr "" +msgstr "Contrasinal" #: plinth/modules/bepasty/views.py:19 msgid "admin" @@ -2175,7 +2175,7 @@ msgstr "" #: plinth/modules/help/__init__.py:33 msgid "Documentation" -msgstr "" +msgstr "Documentación" #: plinth/modules/help/__init__.py:37 plinth/templates/help-menu.html:20 #: plinth/templates/help-menu.html:21 plinth/templates/index.html:120 From 99aa6e44f1fffc3351287f4a07d43214f7b14dbf Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 30 Dec 2022 19:18:03 +0000 Subject: [PATCH 05/13] Translated using Weblate (Spanish) Currently translated at 100.0% (1484 of 1484 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 1eaa92594..cc8bd8248 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-19 20:15-0500\n" -"PO-Revision-Date: 2022-12-28 16:51+0000\n" +"PO-Revision-Date: 2023-01-01 18:49+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -489,9 +489,9 @@ msgid "" "To restore a backup on a new %(box_name)s you need the SSH credentials and, " "if chosen, the encryption passphrase." msgstr "" -"Las credenciales para este repositorio están almacenadas en su %(box_name)s. " -"
Para restaurar una copia de respaldo en una nueva %(box_name)s " -"necesitas las credenciales SSH, y opcionalmente la contraseña de cifrado." +"Las credenciales para este archivo se almacenan en sus %(box_name)s.
" +"Para restaurar una copia de seguridad a un nuevo %(box_name)s, necesita las " +"credenciales SSH y, si se selecciona, la frase de contraseña de cifrado." #: plinth/modules/backups/templates/backups_add_remote_repository.html:28 msgid "Create Location" @@ -1389,7 +1389,7 @@ msgstr "Asistente VoIP" #: plinth/modules/coturn/forms.py:22 msgid "Invalid list of STUN/TURN Server URIs" -msgstr "Lista de URIs de servidores STUN/TURN inválidas" +msgstr "Lista de URIS del servidor Stun/Turn no válida" #: plinth/modules/coturn/templates/coturn.html:15 msgid "Use the following URLs to configure your communication server:" @@ -1755,7 +1755,7 @@ msgstr "Use IPv6 en vez de IPv4" #: plinth/modules/dynamicdns/forms.py:123 msgid "This field is required." -msgstr "Este campo es obligatorio." +msgstr "Este es un campo obligatorio." #: plinth/modules/dynamicdns/templates/dynamicdns.html:11 #: plinth/modules/ejabberd/templates/ejabberd.html:13 @@ -4929,12 +4929,11 @@ msgid "" "You can also access the rest of the Internet via {box_name} for added " "security and anonymity." msgstr "" -"Una red privada virtual (VPN, Virtual Private Network) es una tecnología que " -"permite conectar de forma segura dos dispositivos para acceder de forma " -"protegida a una red privada. Al estar lejos de casa puede conectarse a su " -"{box_name} para acceder a su red local y a los servicios de {box_name} de " -"forma privada. También puede acceder a Internet a través de su {box_name} " -"para añadir protección y anonimato." +"La red privada virtual (VPN) es una técnica para conectar de forma segura " +"dos dispositivos para acceder a los recursos de una red privada. Mientras " +"esté fuera de casa, puede conectarse a su {box_name} para acceder a su red " +"local y a los servicios proporcionados por {box_name}. También puede acceder " +"al resto de Internet a través de {box_name} para mayor seguridad y anonimato." #: plinth/modules/openvpn/__init__.py:43 msgid "Connect to VPN services" From bc09cd42bb0280074856f50972e92449226c05f6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 2 Jan 2023 16:21:47 -0800 Subject: [PATCH 06/13] operation: tests: Fix warning when test helpers start with 'Test' Don't start the helper class name with 'Test' as it will be treated as a class with test cases to run. Fixes #2288. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/tests/test_operation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/tests/test_operation.py b/plinth/tests/test_operation.py index 2991bb346..21af4dcc6 100644 --- a/plinth/tests/test_operation.py +++ b/plinth/tests/test_operation.py @@ -14,7 +14,7 @@ from ..notification import Notification from ..operation import Operation, OperationsManager -class TestApp(app.App): +class AppTest(app.App): app_id = 'testapp' def __init__(self): @@ -207,7 +207,7 @@ def test_message(app_get): @pytest.mark.django_db def test_update_notification(app_get): """Test that operation notification is created.""" - app_get.return_value = TestApp() + app_get.return_value = AppTest() operation = Operation('testapp', 'op1', Mock(), show_notification=True) note = Notification.get('testapp-operation') assert note.id == 'testapp-operation' From 16cb8ee02154dacd3c6872ed32586e47956e41ae Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 2 Jan 2023 15:36:19 -0800 Subject: [PATCH 07/13] package: Don't uninstall packages that are in use by other apps Closes: #2262. Tests: - Unit tests work - Uninstall of email app succeeds without uninstalling openssl package. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/package.py | 22 +++++++++++-- plinth/tests/test_package.py | 64 ++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/plinth/package.py b/plinth/package.py index 6ed4d2245..3c4ea5b33 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -12,7 +12,7 @@ from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy import plinth.privileged.packages as privileged -from plinth import app +from plinth import app as app_module from plinth.errors import MissingPackageError from plinth.utils import format_lazy @@ -94,7 +94,7 @@ class PackageOr(PackageExpression): return self.package2.actual() -class Packages(app.FollowerComponent): +class Packages(app_module.FollowerComponent): """Component to manage the packages of an app. This component is responsible for installation, upgrades and uninstallation @@ -182,7 +182,23 @@ class Packages(app.FollowerComponent): def uninstall(self): """Uninstall and purge the packages.""" - uninstall(self.get_actual_packages()) + packages = self.get_actual_packages() + packages_set = set(packages) + for app in app_module.App.list(): + # uninstall() will be called on Packages of this app separately + # for uninstalling this app. + if app == self.app: + continue + + if app.get_setup_state() == app_module.App.SetupState.NEEDS_SETUP: + continue + + # Remove packages used by other installed apps + for component in app.get_components_of_type(Packages): + packages_set -= set(component.get_actual_packages()) + + # Preserve order of packages for ease of testing + uninstall([package for package in packages if package in packages_set]) def diagnose(self): """Run diagnostics and return results.""" diff --git a/plinth/tests/test_package.py b/plinth/tests/test_package.py index 3b40ae535..31c0a3e04 100644 --- a/plinth/tests/test_package.py +++ b/plinth/tests/test_package.py @@ -13,6 +13,12 @@ from plinth.errors import MissingPackageError from plinth.package import Package, Packages, packages_installed +@pytest.fixture(autouse=True) +def fixture_clean_apps(): + """Fixture to ensure clean set of global apps.""" + App._all_apps = {} + + class TestPackageExpressions(unittest.TestCase): def test_package(self): @@ -159,6 +165,64 @@ def test_packages_uninstall(uninstall): uninstall.assert_has_calls([call(['python3', 'bash'])]) +@patch('plinth.package.uninstall') +@patch('apt.Cache') +def test_packages_uninstall_exclusion(cache, uninstall): + """Test excluding packages from other installed apps when uninstalling.""" + cache.return_value = { + 'package11': Mock(candidate=Mock(version='2.0', is_installed=True)), + 'package12': Mock(candidate=Mock(version='3.0', is_installed=False)), + 'package2': Mock(candidate=Mock(version='4.0', is_installed=True)), + 'package3': Mock(candidate=Mock(version='5.0', is_installed=True)), + } + + class TestApp1(App): + """Test app.""" + app_id = 'test-app1' + + def __init__(self): + super().__init__() + component = Packages('test-component11', + ['package11', 'package2', 'package3']) + self.add(component) + + component = Packages('test-component12', + ['package12', 'package2', 'package3']) + self.add(component) + + class TestApp2(App): + """Test app.""" + app_id = 'test-app2' + + def __init__(self): + super().__init__() + component = Packages('test-component2', ['package2']) + self.add(component) + + def get_setup_state(self): + return App.SetupState.UP_TO_DATE + + class TestApp3(App): + """Test app.""" + app_id = 'test-app3' + + def __init__(self): + super().__init__() + component = Packages('test-component3', ['package3']) + self.add(component) + + def get_setup_state(self): + return App.SetupState.NEEDS_SETUP + + app1 = TestApp1() + TestApp2() + TestApp3() + app1.uninstall() + uninstall.assert_has_calls( + [call(['package11', 'package3']), + call(['package12', 'package3'])]) + + @patch('apt.Cache') def test_diagnose(cache): """Test checking for latest version of the package.""" From 82104ccf847531944b32810f677cc6cc5c36ccc8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 2 Jan 2023 15:38:42 -0800 Subject: [PATCH 08/13] email: Workaround an issue with error on finishing uninstall Showing the uninstall progress page fails during uninstall of email app. Workaround that by handling the errors raised. A better approach is to ensure that the view is not processed when uninstall operation is in progress. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/email/views.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plinth/modules/email/views.py b/plinth/modules/email/views.py index bac67c3b2..2f48354bb 100644 --- a/plinth/modules/email/views.py +++ b/plinth/modules/email/views.py @@ -25,14 +25,22 @@ class EmailAppView(AppView): def get_context_data(self, **kwargs): """Add additional context data for rendering the template.""" context = super().get_context_data(**kwargs) - context['dns_entries'] = dns.get_entries() + try: # Handle error during uninstall of app + context['dns_entries'] = dns.get_entries() + except FileNotFoundError: + pass + return context def get_initial(self): """Return the initial values to populate in the form.""" initial = super().get_initial() - domains = privileged.domain.get_domains() - initial['primary_domain'] = domains['primary_domain'] + try: # Handle error during uninstall of app + domains = privileged.domain.get_domains() + initial['primary_domain'] = domains['primary_domain'] + except FileNotFoundError: + pass + return initial def form_valid(self, form): From 2607fffd47454f428cb9dc2fa50bf9945dba1628 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 2 Jan 2023 15:44:28 -0800 Subject: [PATCH 09/13] zoph: Add explicit dependency on default-mysql-server This is to ensure that mysql server is not uninstalled when wordpress is uninstalled. Tests: - Uninstalling zoph does not remove default-mysql-server when wordpress is installed. - Uninstalling wordpress does not remove default-mysql-server when zoph is installed. - Uninstalling both wordpress and zoph removes default-mysql-server. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/zoph/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/zoph/__init__.py b/plinth/modules/zoph/__init__.py index 7d4b7f6c1..09aa395f5 100644 --- a/plinth/modules/zoph/__init__.py +++ b/plinth/modules/zoph/__init__.py @@ -67,7 +67,7 @@ class ZophApp(app_module.App): login_required=True) self.add(shortcut) - packages = Packages('packages-zoph', ['zoph'], + packages = Packages('packages-zoph', ['zoph', 'default-mysql-server'], conflicts=['libpam-tmpdir'], conflicts_action=Packages.ConflictsAction.REMOVE) self.add(packages) From 863afa34ce53323a6341e293928a745897f0568b Mon Sep 17 00:00:00 2001 From: nbenedek Date: Sun, 30 Oct 2022 15:51:30 +0100 Subject: [PATCH 10/13] tor: Add onion location to apache - When hidden service is enabled create and enable an apache site with the proper configurations. This will let visitors using the Tor browser that a hidden version of the website is available. - Disable apache site when hidden service is disabled - Create a backup of the apache site - Hidden service won't be advertised when the user visits mediawiki, wordpress or tt-rss. These sites don't work (well) with a hidden service when a normal domain is already set up. Tests: - Functional tests pass. - With fresh install of Tor app, onion location header apache configuration is enabled and header is served in HTTP requests. - When Onion services are enabled/disabled, header is enabled/disabled due to webserver configuration changes. - When Tor app is enabled/disabled, header is enabled/disabled due to webserver configuration being enabled/disabled. - When Tor app is upgraded from earlier version while app is enabled, onion service is enabled, Tor app remains enabled. Onion location is enabled. - FAILED: When Tor app is upgraded from earlier version while app is enabled, onion service is disabled, Tor app remains enabled. Onion location is disabled. - FAILED: When Tor app is upgraded from earlier version while app is disabled, onion service is enabled, Tor app remains disabled. Onion location is disabled. - FAILED: When Tor app is upgraded from earlier version while app is disabled, onion service is disabled, Tor app remains disabled. Onion location is disabled. Signed-off-by: nbenedek [sunil: Ensure that enabling/disabling app enables/disables onion location] [sunil: Ensure that upgrading from old version does not enable the app] [sunil: Ensure that upgrading from old version enables/disables onion location] [sunil: Apache file should be a 'config' and not 'site'] Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/tor/__init__.py | 24 ++++++++++++++++++++---- plinth/modules/tor/manifest.py | 5 ++++- plinth/modules/tor/privileged.py | 24 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index cae907cde..122d8fe57 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -8,7 +8,7 @@ from plinth import app as app_module from plinth import cfg, menu from plinth.daemon import (Daemon, app_is_running, diagnose_netcat, diagnose_port_listening) -from plinth.modules.apache.components import diagnose_url +from plinth.modules.apache.components import Webserver, diagnose_url from plinth.modules.backups.components import BackupRestore from plinth.modules.firewall.components import Firewall from plinth.modules.names.components import DomainType @@ -37,7 +37,7 @@ class TorApp(app_module.App): app_id = 'tor' - _version = 5 + _version = 6 def __init__(self): """Create components for the app.""" @@ -81,6 +81,10 @@ class TorApp(app_module.App): (9040, 'tcp6'), (9053, 'udp4'), (9053, 'udp6')]) self.add(daemon) + webserver = Webserver('webserver-onion-location', + 'onion-location-freedombox') + self.add(webserver) + users_and_groups = UsersAndGroups('users-and-groups-tor', reserved_usernames=['debian-tor']) self.add(users_and_groups) @@ -168,8 +172,20 @@ class TorApp(app_module.App): if not old_version: privileged.configure(apt_transport_tor=True) - update_hidden_service_domain() - self.enable() + update_hidden_service_domain(utils.get_status()) + + # Enable/disable Onion-Location component based on app status. + # Component was introduced in version 6. + if old_version and old_version < 6: + daemon_component = self.get_component('daemon-tor') + component = self.get_component('webserver-onion-location') + if daemon_component.is_enabled(): + component.enable() + else: + component.disable() + + if not old_version: + self.enable() def update_hidden_service_domain(status=None): diff --git a/plinth/modules/tor/manifest.py b/plinth/modules/tor/manifest.py index a26fbeac2..0657b6c06 100644 --- a/plinth/modules/tor/manifest.py +++ b/plinth/modules/tor/manifest.py @@ -4,6 +4,8 @@ from django.utils.translation import gettext_lazy as _ from plinth.clients import store_url +from . import privileged + _orbot_package_id = 'org.torproject.android' _tor_browser_download_url = \ 'https://www.torproject.org/download/download-easy.html' @@ -42,7 +44,8 @@ clients = [{ backup = { 'config': { - 'directories': ['/etc/tor/'] + 'directories': ['/etc/tor/'], + 'files': [str(privileged.TOR_APACHE_SITE)] }, 'secrets': { 'directories': ['/var/lib/tor/', '/var/lib/tor-instances/'] diff --git a/plinth/modules/tor/privileged.py b/plinth/modules/tor/privileged.py index 75b572001..d799e4739 100644 --- a/plinth/modules/tor/privileged.py +++ b/plinth/modules/tor/privileged.py @@ -3,6 +3,7 @@ import codecs import os +import pathlib import re import socket import subprocess @@ -20,6 +21,7 @@ SERVICE_FILE = '/etc/firewalld/services/tor-{0}.xml' TOR_CONFIG = '/files/etc/tor/instances/plinth/torrc' TOR_STATE_FILE = '/var/lib/tor-instances/plinth/state' TOR_AUTH_COOKIE = '/var/run/tor-instances/plinth/control.authcookie' +TOR_APACHE_SITE = '/etc/apache2/conf-available/onion-location-freedombox.conf' @privileged @@ -30,6 +32,7 @@ def setup(old_version: int): return _first_time_setup() + _set_onion_header(_get_hidden_service(aug=None)) def _first_time_setup(): @@ -391,6 +394,7 @@ def _enable_hs(aug=None): aug.set(TOR_CONFIG + '/HiddenServicePort[2]', '80 127.0.0.1:80') aug.set(TOR_CONFIG + '/HiddenServicePort[3]', '443 127.0.0.1:443') aug.save() + _set_onion_header(_get_hidden_service(aug)) def _disable_hs(aug=None): @@ -404,6 +408,7 @@ def _disable_hs(aug=None): aug.remove(TOR_CONFIG + '/HiddenServiceDir') aug.remove(TOR_CONFIG + '/HiddenServicePort') aug.save() + _set_onion_header(None) def _enable_apt_transport_tor(): @@ -486,3 +491,22 @@ def augeas_load(): '/etc/tor/instances/plinth/torrc') aug.load() return aug + + +def _set_onion_header(hidden_service): + """Set Apache configuration for the Onion-Location header.""" + config_file = pathlib.Path(TOR_APACHE_SITE) + if hidden_service and hidden_service['enabled']: + # https://community.torproject.org/onion-services/advanced/onion-location/ + hostname = hidden_service['hostname'] + config_contents = f'''# This file is managed by FreedomBox + + Header set Onion-Location "http://{hostname}%{{REQUEST_URI}}s" + +''' + config_file.write_text(config_contents, encoding='utf-8') + else: + config_file.write_text('# This file is managed by FreedomBox\n', + encoding='utf-8') + + action_utils.service_reload('apache2') From 99d795e9285309f3e54a78866553df9d8e68a542 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 3 Jan 2023 10:42:23 -0500 Subject: [PATCH 11/13] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/ar_SA/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/bg/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/bn/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/cs/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/da/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/de/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/django.pot | 64 ++++++++++----------- plinth/locale/el/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/es/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/fa/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/fake/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/fr/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/gl/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/gu/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/hi/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/hu/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/id/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/it/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/ja/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/kn/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/lt/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/lv/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/nb/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/nl/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/pl/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/pt/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/ru/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/si/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/sl/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/sq/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/sr/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/sv/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/ta/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/te/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/tr/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/uk/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/vi/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 64 ++++++++++----------- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 64 ++++++++++----------- 40 files changed, 1280 insertions(+), 1280 deletions(-) diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index b9ea1f256..1dba726c4 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: 2022-12-19 20:15-0500\n" +"POT-Creation-Date: 2023-01-03 10:41-0500\n" "PO-Revision-Date: 2022-03-31 09:12+0000\n" "Last-Translator: abidin toumi \n" "Language-Team: Arabic \n" "Language-Team: Arabic (Saudi Arabia) \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Czech \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: LANGUAGE \n" @@ -828,7 +828,7 @@ msgstr "" msgid "Configuration updated." msgstr "" -#: plinth/modules/bepasty/views.py:91 plinth/modules/email/views.py:48 +#: plinth/modules/bepasty/views.py:91 plinth/modules/email/views.py:56 #: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:38 #: plinth/modules/searx/views.py:49 plinth/modules/zoph/views.py:74 msgid "An error occurred during configuration." @@ -911,7 +911,7 @@ msgstr "" #: plinth/modules/bind/views.py:61 plinth/modules/config/views.py:98 #: plinth/modules/coturn/views.py:40 plinth/modules/deluge/views.py:35 #: plinth/modules/dynamicdns/views.py:78 plinth/modules/ejabberd/views.py:95 -#: plinth/modules/email/views.py:45 plinth/modules/matrixsynapse/views.py:128 +#: plinth/modules/email/views.py:53 plinth/modules/matrixsynapse/views.py:128 #: plinth/modules/minetest/views.py:55 plinth/modules/mumble/views.py:37 #: plinth/modules/pagekite/forms.py:74 plinth/modules/privacy/views.py:36 #: plinth/modules/quassel/views.py:29 plinth/modules/roundcube/views.py:32 @@ -2049,7 +2049,7 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: plinth/modules/gitweb/__init__.py:49 plinth/modules/gitweb/manifest.py:10 +#: plinth/modules/gitweb/__init__.py:49 plinth/modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" @@ -2057,59 +2057,59 @@ msgstr "" msgid "Simple Git Hosting" msgstr "" -#: plinth/modules/gitweb/forms.py:58 +#: plinth/modules/gitweb/forms.py:59 msgid "Invalid repository URL." msgstr "" -#: plinth/modules/gitweb/forms.py:68 +#: plinth/modules/gitweb/forms.py:69 msgid "Invalid repository name." msgstr "" -#: plinth/modules/gitweb/forms.py:76 +#: plinth/modules/gitweb/forms.py:77 msgid "Name of a new repository or URL to import an existing repository." msgstr "" -#: plinth/modules/gitweb/forms.py:82 +#: plinth/modules/gitweb/forms.py:83 msgid "Description of the repository" msgstr "" -#: plinth/modules/gitweb/forms.py:83 plinth/modules/gitweb/forms.py:87 +#: plinth/modules/gitweb/forms.py:84 plinth/modules/gitweb/forms.py:88 msgid "Optional, for displaying on Gitweb." msgstr "" -#: plinth/modules/gitweb/forms.py:85 +#: plinth/modules/gitweb/forms.py:86 msgid "Repository's owner name" msgstr "" -#: plinth/modules/gitweb/forms.py:90 +#: plinth/modules/gitweb/forms.py:91 msgid "Private repository" msgstr "" -#: plinth/modules/gitweb/forms.py:91 +#: plinth/modules/gitweb/forms.py:92 msgid "Allow only authorized users to access this repository." msgstr "" -#: plinth/modules/gitweb/forms.py:112 plinth/modules/gitweb/forms.py:154 +#: plinth/modules/gitweb/forms.py:113 plinth/modules/gitweb/forms.py:155 msgid "A repository with this name already exists." msgstr "" -#: plinth/modules/gitweb/forms.py:125 +#: plinth/modules/gitweb/forms.py:126 msgid "Name of the repository" msgstr "" -#: plinth/modules/gitweb/forms.py:129 +#: plinth/modules/gitweb/forms.py:130 msgid "An alpha-numeric string that uniquely identifies a repository." msgstr "" -#: plinth/modules/gitweb/forms.py:133 +#: plinth/modules/gitweb/forms.py:134 msgid "Default branch" msgstr "" -#: plinth/modules/gitweb/forms.py:134 +#: plinth/modules/gitweb/forms.py:135 msgid "Gitweb displays this as a default branch." msgstr "" -#: plinth/modules/gitweb/manifest.py:18 +#: plinth/modules/gitweb/manifest.py:19 msgid "Git" msgstr "" @@ -5926,24 +5926,24 @@ msgstr "" msgid "Tor Bridge Relay" msgstr "" -#: plinth/modules/tor/__init__.py:127 +#: plinth/modules/tor/__init__.py:131 msgid "Tor relay port available" msgstr "" -#: plinth/modules/tor/__init__.py:137 +#: plinth/modules/tor/__init__.py:141 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:147 +#: plinth/modules/tor/__init__.py:151 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:212 +#: plinth/modules/tor/__init__.py:228 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:223 +#: plinth/modules/tor/__init__.py:239 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6025,11 +6025,11 @@ msgstr "" msgid "Specify at least one upstream bridge to use upstream bridges." msgstr "" -#: plinth/modules/tor/manifest.py:13 +#: plinth/modules/tor/manifest.py:15 msgid "Tor Browser" msgstr "" -#: plinth/modules/tor/manifest.py:29 +#: plinth/modules/tor/manifest.py:31 msgid "Orbot: Proxy with Tor" msgstr "" @@ -7029,34 +7029,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:195 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:208 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:355 +#: plinth/package.py:371 msgid "installing" msgstr "" -#: plinth/package.py:357 +#: plinth/package.py:373 msgid "downloading" msgstr "" -#: plinth/package.py:359 +#: plinth/package.py:375 msgid "media change" msgstr "" -#: plinth/package.py:361 +#: plinth/package.py:377 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:389 plinth/package.py:414 +#: plinth/package.py:405 plinth/package.py:430 msgid "Timeout waiting for package manager" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index f129dcdf8..1a678214f 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: 2022-12-19 20:15-0500\n" +"POT-Creation-Date: 2023-01-03 10:41-0500\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek \n" "Language-Team: Spanish \n" "Language-Team: Persian \n" "Language-Team: Plinth Developers \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Gujarati \n" "Language-Team: Hindi media." -#: plinth/modules/gitweb/forms.py:133 +#: plinth/modules/gitweb/forms.py:134 #, fuzzy #| msgid "Default" msgid "Default branch" msgstr "डिफ़ॉल्ट" -#: plinth/modules/gitweb/forms.py:134 +#: plinth/modules/gitweb/forms.py:135 msgid "Gitweb displays this as a default branch." msgstr "" -#: plinth/modules/gitweb/manifest.py:18 +#: plinth/modules/gitweb/manifest.py:19 msgid "Git" msgstr "" @@ -6834,24 +6834,24 @@ msgstr "टोर सोक्स प्रॉक्सी" msgid "Tor Bridge Relay" msgstr "टो ब्रिज रीले" -#: plinth/modules/tor/__init__.py:127 +#: plinth/modules/tor/__init__.py:131 msgid "Tor relay port available" msgstr "टोर रीले पोर्ट उपलब्ध है" -#: plinth/modules/tor/__init__.py:137 +#: plinth/modules/tor/__init__.py:141 msgid "Obfs3 transport registered" msgstr "Obfs3 ट्रांसपोर्ट पंजीकृत" -#: plinth/modules/tor/__init__.py:147 +#: plinth/modules/tor/__init__.py:151 msgid "Obfs4 transport registered" msgstr "Obfs4 ट्रांसपोर्ट पंजीकृत" -#: plinth/modules/tor/__init__.py:212 +#: plinth/modules/tor/__init__.py:228 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "यूआरएल एक्सेस करें {url} टीसीपी पर {kind} टोर के माध्यम से" -#: plinth/modules/tor/__init__.py:223 +#: plinth/modules/tor/__init__.py:239 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "टोर उपयोग की पुष्टि करें {url} पर टीसीपी पर {kind}" @@ -6956,11 +6956,11 @@ msgstr "" msgid "Specify at least one upstream bridge to use upstream bridges." msgstr "अपस्ट्रीम ब्रिजस उपयोग करने के लिए एक अपस्ट्रीम ब्रिजस निर्दिष्ट करें." -#: plinth/modules/tor/manifest.py:13 +#: plinth/modules/tor/manifest.py:15 msgid "Tor Browser" msgstr "टोर ब्राउजर" -#: plinth/modules/tor/manifest.py:29 +#: plinth/modules/tor/manifest.py:31 msgid "Orbot: Proxy with Tor" msgstr "अोरबोट: टोर के साथ प्रॉक्सी" @@ -8150,34 +8150,34 @@ msgstr "" msgid "Finished: {name}" msgstr "सर्विस सक्षम किया गया:{name}" -#: plinth/package.py:195 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:208 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:355 +#: plinth/package.py:371 msgid "installing" msgstr "इंस्टॉलिंग" -#: plinth/package.py:357 +#: plinth/package.py:373 msgid "downloading" msgstr "डाउनलोडिंग" -#: plinth/package.py:359 +#: plinth/package.py:375 msgid "media change" msgstr "मीडिया बदलाव" -#: plinth/package.py:361 +#: plinth/package.py:377 #, python-brace-format msgid "configuration file: {file}" msgstr "कॉंफ़िगरेशन फ़ाइल: {file}" -#: plinth/package.py:389 plinth/package.py:414 +#: plinth/package.py:405 plinth/package.py:430 msgid "Timeout waiting for package manager" msgstr "" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index bf0fade58..c8bb297d2 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-12-19 20:15-0500\n" +"POT-Creation-Date: 2023-01-03 10:41-0500\n" "PO-Revision-Date: 2022-10-24 18:39+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Hungarian \n" "Language-Team: Indonesian \n" "Language-Team: Italian \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: LANGUAGE \n" @@ -829,7 +829,7 @@ msgstr "" msgid "Configuration updated." msgstr "" -#: plinth/modules/bepasty/views.py:91 plinth/modules/email/views.py:48 +#: plinth/modules/bepasty/views.py:91 plinth/modules/email/views.py:56 #: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:38 #: plinth/modules/searx/views.py:49 plinth/modules/zoph/views.py:74 msgid "An error occurred during configuration." @@ -912,7 +912,7 @@ msgstr "" #: plinth/modules/bind/views.py:61 plinth/modules/config/views.py:98 #: plinth/modules/coturn/views.py:40 plinth/modules/deluge/views.py:35 #: plinth/modules/dynamicdns/views.py:78 plinth/modules/ejabberd/views.py:95 -#: plinth/modules/email/views.py:45 plinth/modules/matrixsynapse/views.py:128 +#: plinth/modules/email/views.py:53 plinth/modules/matrixsynapse/views.py:128 #: plinth/modules/minetest/views.py:55 plinth/modules/mumble/views.py:37 #: plinth/modules/pagekite/forms.py:74 plinth/modules/privacy/views.py:36 #: plinth/modules/quassel/views.py:29 plinth/modules/roundcube/views.py:32 @@ -2050,7 +2050,7 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: plinth/modules/gitweb/__init__.py:49 plinth/modules/gitweb/manifest.py:10 +#: plinth/modules/gitweb/__init__.py:49 plinth/modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" @@ -2058,59 +2058,59 @@ msgstr "" msgid "Simple Git Hosting" msgstr "" -#: plinth/modules/gitweb/forms.py:58 +#: plinth/modules/gitweb/forms.py:59 msgid "Invalid repository URL." msgstr "" -#: plinth/modules/gitweb/forms.py:68 +#: plinth/modules/gitweb/forms.py:69 msgid "Invalid repository name." msgstr "" -#: plinth/modules/gitweb/forms.py:76 +#: plinth/modules/gitweb/forms.py:77 msgid "Name of a new repository or URL to import an existing repository." msgstr "" -#: plinth/modules/gitweb/forms.py:82 +#: plinth/modules/gitweb/forms.py:83 msgid "Description of the repository" msgstr "" -#: plinth/modules/gitweb/forms.py:83 plinth/modules/gitweb/forms.py:87 +#: plinth/modules/gitweb/forms.py:84 plinth/modules/gitweb/forms.py:88 msgid "Optional, for displaying on Gitweb." msgstr "" -#: plinth/modules/gitweb/forms.py:85 +#: plinth/modules/gitweb/forms.py:86 msgid "Repository's owner name" msgstr "" -#: plinth/modules/gitweb/forms.py:90 +#: plinth/modules/gitweb/forms.py:91 msgid "Private repository" msgstr "" -#: plinth/modules/gitweb/forms.py:91 +#: plinth/modules/gitweb/forms.py:92 msgid "Allow only authorized users to access this repository." msgstr "" -#: plinth/modules/gitweb/forms.py:112 plinth/modules/gitweb/forms.py:154 +#: plinth/modules/gitweb/forms.py:113 plinth/modules/gitweb/forms.py:155 msgid "A repository with this name already exists." msgstr "" -#: plinth/modules/gitweb/forms.py:125 +#: plinth/modules/gitweb/forms.py:126 msgid "Name of the repository" msgstr "" -#: plinth/modules/gitweb/forms.py:129 +#: plinth/modules/gitweb/forms.py:130 msgid "An alpha-numeric string that uniquely identifies a repository." msgstr "" -#: plinth/modules/gitweb/forms.py:133 +#: plinth/modules/gitweb/forms.py:134 msgid "Default branch" msgstr "" -#: plinth/modules/gitweb/forms.py:134 +#: plinth/modules/gitweb/forms.py:135 msgid "Gitweb displays this as a default branch." msgstr "" -#: plinth/modules/gitweb/manifest.py:18 +#: plinth/modules/gitweb/manifest.py:19 msgid "Git" msgstr "" @@ -5927,24 +5927,24 @@ msgstr "" msgid "Tor Bridge Relay" msgstr "" -#: plinth/modules/tor/__init__.py:127 +#: plinth/modules/tor/__init__.py:131 msgid "Tor relay port available" msgstr "" -#: plinth/modules/tor/__init__.py:137 +#: plinth/modules/tor/__init__.py:141 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:147 +#: plinth/modules/tor/__init__.py:151 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:212 +#: plinth/modules/tor/__init__.py:228 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:223 +#: plinth/modules/tor/__init__.py:239 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6026,11 +6026,11 @@ msgstr "" msgid "Specify at least one upstream bridge to use upstream bridges." msgstr "" -#: plinth/modules/tor/manifest.py:13 +#: plinth/modules/tor/manifest.py:15 msgid "Tor Browser" msgstr "" -#: plinth/modules/tor/manifest.py:29 +#: plinth/modules/tor/manifest.py:31 msgid "Orbot: Proxy with Tor" msgstr "" @@ -7030,34 +7030,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:195 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:208 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:355 +#: plinth/package.py:371 msgid "installing" msgstr "" -#: plinth/package.py:357 +#: plinth/package.py:373 msgid "downloading" msgstr "" -#: plinth/package.py:359 +#: plinth/package.py:375 msgid "media change" msgstr "" -#: plinth/package.py:361 +#: plinth/package.py:377 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:389 plinth/package.py:414 +#: plinth/package.py:405 plinth/package.py:430 msgid "Timeout waiting for package manager" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 040a5e20e..3542affee 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-12-19 20:15-0500\n" +"POT-Creation-Date: 2023-01-03 10:41-0500\n" "PO-Revision-Date: 2022-03-02 12:27+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" "Language-Team: Vietnamese \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) Date: Tue, 3 Jan 2023 11:54:44 -0500 Subject: [PATCH 12/13] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/ReleaseNotes.raw.wiki | 16 ++++++++++++++++ doc/manual/es/ReleaseNotes.raw.wiki | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index b5f6e8a3c..78b988f2a 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,22 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.1 (2023-01-03) == + +=== Highlights === + + * package: Don't uninstall packages that are in use by other apps + * tor: Add onion location to apache + +=== Other Changes === + + * email: Workaround an issue with error on finishing uninstall + * gitweb: Run git commands as a web user + * janus: Allow upgrade to 1.1 + * locale: Update translations for Galician, Spanish + * operation: tests: Fix warning when test helpers start with 'Test' + * zoph: Add explicit dependency on default-mysql-server + == FreedomBox 22.27 (2022-12-19) == === Highlights === diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index b5f6e8a3c..78b988f2a 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,22 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.1 (2023-01-03) == + +=== Highlights === + + * package: Don't uninstall packages that are in use by other apps + * tor: Add onion location to apache + +=== Other Changes === + + * email: Workaround an issue with error on finishing uninstall + * gitweb: Run git commands as a web user + * janus: Allow upgrade to 1.1 + * locale: Update translations for Galician, Spanish + * operation: tests: Fix warning when test helpers start with 'Test' + * zoph: Add explicit dependency on default-mysql-server + == FreedomBox 22.27 (2022-12-19) == === Highlights === From 3e7b6bb451543f17b8abfb7e8ba52889dbb5a2d5 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 3 Jan 2023 11:55:21 -0500 Subject: [PATCH 13/13] Release v23.1 to unstable Signed-off-by: James Valleroy --- debian/changelog | 26 ++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 3a936bf51..7e573a91b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,29 @@ +freedombox (23.1) unstable; urgency=medium + + [ gallegonovato ] + * Translated using Weblate (Spanish) + * Translated using Weblate (Galician) + * Translated using Weblate (Spanish) + + [ James Valleroy ] + * janus: Allow upgrade to 1.1 + * locale: Update translation strings + * doc: Fetch latest manual + + [ Veiko Aasa ] + * gitweb: Run git commands as a web user + + [ Sunil Mohan Adapa ] + * operation: tests: Fix warning when test helpers start with 'Test' + * package: Don't uninstall packages that are in use by other apps + * email: Workaround an issue with error on finishing uninstall + * zoph: Add explicit dependency on default-mysql-server + + [ nbenedek ] + * tor: Add onion location to apache + + -- James Valleroy Tue, 03 Jan 2023 11:54:58 -0500 + freedombox (22.27) unstable; urgency=medium [ ikmaak ] diff --git a/plinth/__init__.py b/plinth/__init__.py index 957f0e485..0a85ea03f 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '22.27' +__version__ = '23.1'