From 0cfe37b2439a110aa08fa3b36765713c63be0bb1 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Tue, 26 Mar 2024 05:02:28 +0000 Subject: [PATCH 01/30] Translated using Weblate (Turkish) Currently translated at 100.0% (1554 of 1554 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 47 ++++++++++---------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index b0285323a..6f5140979 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-01-31 05:01+0000\n" +"PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish \n" @@ -16,7 +16,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.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: config.py:120 #, python-brace-format @@ -102,14 +102,12 @@ msgid "Use the language preference set in the browser" msgstr "Tarayıcıda ayarlanan dil tercihini kullan" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "Herkese Açık Görünürlük" +msgstr "Görünürlük" #: menu.py:108 msgid "Data" -msgstr "" +msgstr "Veri" #: menu.py:110 templates/base.html:131 msgid "System" @@ -121,10 +119,8 @@ msgid "Security" msgstr "Güvenlik" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Sunucu Yönetimi" +msgstr "Yönetim" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -3391,10 +3387,9 @@ msgstr "" "etkili olması birkaç dakika alabilir." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "{domain} etki alanı için sertifika iptal etme başarısız oldu: {error}" +msgstr "{domain} etki alanı için sertifika iptal etme başarısız oldu" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3402,10 +3397,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "{domain} etki alanı için sertifika başarılı olarak elde edildi" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "{domain} etki alanı için sertifika elde etme başarısız oldu: {error}" +msgstr "{domain} etki alanı için sertifika elde etme başarısız oldu" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3413,10 +3407,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "{domain} etki alanı için sertifika başarılı olarak silindi" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "{domain} etki alanı için sertifika silme başarısız oldu: {error}" +msgstr "{domain} etki alanı için sertifika silme başarısız oldu" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6704,20 +6697,16 @@ msgid "Created snapshot." msgstr "Anlık görüntü oluşturuldu." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Yapılandırma güncellendi." +msgstr "Yapılandırma güncellemesi başarısız oldu." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Seçilen anlık görüntüler silindi" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "LDAP kullanıcısının silinmesi başarısız oldu." +msgstr "Anlık görüntünün silinmesi başarısız oldu." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -7071,10 +7060,8 @@ msgid "Device can be safely unplugged." msgstr "Aygıt güvenli bir şekilde çıkarılabilir." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Aygıt çıkarılırken hata oldu: {error_message}" +msgstr "Aygıt çıkarılırken hata oldu." #: modules/syncthing/__init__.py:23 msgid "" @@ -7685,10 +7672,8 @@ msgid "Test distribution upgrade now" msgstr "Dağıtım yükseltmesini şimdi dene" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" -msgstr "unattended-upgrades yapılandırılırken bir hata oldu: {error}" +msgstr "unattended-upgrades yapılandırılırken bir hata oldu" #: modules/upgrades/views.py:120 msgid "Upgrade process started." @@ -7760,6 +7745,8 @@ msgstr "Kullanıcı adı alınmış veya ayrılmış." msgid "" "Optional. Used to send emails to reset password and important notifications." msgstr "" +"İsteğe bağlı. Parolayı sıfırlamak ve önemli bildirimleri e-posta olarak " +"göndermek için kullanılır." #: modules/users/forms.py:106 msgid "" From a3cd247daa0cf4d5fdc9155ae9ed49accb3cfa2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Tue, 26 Mar 2024 07:55:54 +0000 Subject: [PATCH 02/30] Translated using Weblate (Chinese (Simplified)) Currently translated at 66.9% (1040 of 1554 strings) --- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 39 +++++++-------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 6e7193198..ba6a04532 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-01-31 05:01+0000\n" +"PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified) Date: Tue, 26 Mar 2024 08:27:00 +0000 Subject: [PATCH 03/30] Translated using Weblate (Albanian) Currently translated at 99.4% (1546 of 1554 strings) --- plinth/locale/sq/LC_MESSAGES/django.po | 44 ++++++++------------------ 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 48dc7f798..5cafd98d2 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-02-13 01:32+0000\n" +"PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \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.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: config.py:120 #, python-brace-format @@ -102,10 +102,8 @@ msgid "Use the language preference set in the browser" msgstr "Përdor parapëlqim gjuhe të caktuar te shfletuesi" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "E dukshme Publikisht" +msgstr "Dukshmëri" #: menu.py:108 msgid "Data" @@ -121,10 +119,8 @@ msgid "Security" msgstr "Siguri" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Administrim Shërbyesi" +msgstr "Administrim" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -3413,10 +3409,9 @@ msgstr "" "çaste të hyjë në fuqi." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "S’u arrit të shfuqizohet dëshmi për përkatësinë {domain}: {error}" +msgstr "S’u arrit të shfuqizohet dëshmi për përkatësinë {domain}" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3424,10 +3419,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "Dëshmi e marrë me sukses për përkatësinë {domain}" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "S’u arrit të merret dëshmi për përkatësinë {domain}: {error}" +msgstr "S’u arrit të merret dëshmi për përkatësinë {domain}" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3435,10 +3429,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "Dëshmi e fshirë me sukses për përkatësinë {domain}" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "S’u arrit të fshihet dëshmi për përkatësinë {domain}: {error}" +msgstr "S’u arrit të fshihet dëshmi për përkatësinë {domain}" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6749,20 +6742,16 @@ msgid "Created snapshot." msgstr "U krijua fotografim." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Formësimi u përditësua." +msgstr "Përditësimi i formësimit dështoi." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "U fshinë fotografimet e përzgjedhur" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "Fshirja e përdoruesi LDAP dështoi." +msgstr "Fshirja e fotografimit dështoi." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -7117,10 +7106,8 @@ msgid "Device can be safely unplugged." msgstr "Pajisja mund të hiqet pa rrezik." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Gabim në nxjerrje pajisjeje: {error_message}" +msgstr "Gabim në nxjerrje pajisjeje." #: modules/syncthing/__init__.py:23 msgid "" @@ -7737,11 +7724,8 @@ msgid "Test distribution upgrade now" msgstr "Testoni përmirësim shpërndarjeje tani" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" -msgstr "" -"Gabim teksa formësohej <em>unattended-upgrades</em>: {error}" +msgstr "Gabim teksa formësohej <em>unattended-upgrades</em>" #: modules/upgrades/views.py:120 msgid "Upgrade process started." From 7c3491a71a4673ba9051335ad96c07532072ad0d Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 27 Mar 2024 00:04:21 +0000 Subject: [PATCH 04/30] Translated using Weblate (Spanish) Currently translated at 100.0% (1554 of 1554 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 47 ++++++++++---------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index cef703c4e..048fe94a3 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: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-02-06 14:01+0000\n" +"PO-Revision-Date: 2024-03-28 01:01+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \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.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: config.py:120 #, python-brace-format @@ -104,14 +104,12 @@ msgid "Use the language preference set in the browser" msgstr "Configure la preferencia de idioma en el navegador" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "Visibilidad pública" +msgstr "Visibilidad" #: menu.py:108 msgid "Data" -msgstr "" +msgstr "Datos" #: menu.py:110 templates/base.html:131 msgid "System" @@ -123,10 +121,8 @@ msgid "Security" msgstr "Protección" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Administración del servidor" +msgstr "Administración" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -3410,10 +3406,9 @@ msgstr "" "Necesitará unos momentos para tener efecto." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "Falló la revocación del certificado para el dominio {domain}: {error}" +msgstr "Falló la revocación del certificado para el dominio {domain}" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3421,10 +3416,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "Se ha obtenido con éxito el certificado para el dominio {domain}" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "Falló la obtención del certificado para el dominio {domain}: {error}" +msgstr "Falló la obtención del certificado para el dominio {domain}" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3432,10 +3426,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "El certificado para el dominio {domain} ha sido eliminado con éxito" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "Falló la eliminación del certificado para el dominio {domain}: {error}" +msgstr "Falló la eliminación del certificado para el dominio {domain}" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6714,20 +6707,16 @@ msgid "Created snapshot." msgstr "Instantánea creada." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Configuración actualizada." +msgstr "Error en la actualización de la configuración." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Las instantáneas seleccionadas fueron eliminadas" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "Ha fallado la eliminación del o de la usuaria LDAP." +msgstr "Error al borrar la instantánea." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -7082,10 +7071,8 @@ msgid "Device can be safely unplugged." msgstr "El dispositivo ya se puede desconectar con seguridad." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Error al expulsar el dispositivo: {error_message}" +msgstr "Error al expulsar el dispositivo." #: modules/syncthing/__init__.py:23 msgid "" @@ -7699,10 +7686,8 @@ msgid "Test distribution upgrade now" msgstr "Pruebe la actualización de distribución ahora" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" -msgstr "Error al configurar las actualizaciones desatendidas: {error}" +msgstr "Error al configurar las actualizaciones desatendidas" #: modules/upgrades/views.py:120 msgid "Upgrade process started." @@ -7774,6 +7759,8 @@ msgstr "El nombre de usuaria/o está en uso o reservado." msgid "" "Optional. Used to send emails to reset password and important notifications." msgstr "" +"Opcional. Se utiliza para enviar correos electrónicos para restablecer la " +"contraseña y notificaciones importantes." #: modules/users/forms.py:106 msgid "" From b1c5c5fa750e9f467f74af9ade2a11ce1c53691c Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 27 Mar 2024 19:07:52 +0000 Subject: [PATCH 05/30] Translated using Weblate (French) Currently translated at 99.0% (1540 of 1554 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index a5e56300b..91363ae57 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-01-05 07:09+0000\n" +"PO-Revision-Date: 2024-03-28 01:01+0000\n" "Last-Translator: John Doe \n" "Language-Team: French \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.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: config.py:120 #, python-brace-format @@ -111,7 +111,7 @@ msgstr "Visibilité publique" #: menu.py:108 msgid "Data" -msgstr "" +msgstr "Données" #: menu.py:110 templates/base.html:131 msgid "System" @@ -7941,6 +7941,8 @@ msgstr "Le nom d’utilisateur est déjà pris ou est réservé." msgid "" "Optional. Used to send emails to reset password and important notifications." msgstr "" +"Optionnel. Utilisé afin d'envoyer des courriels pour réinitialiser le mot de " +"passe et pour les notifications importantes." #: modules/users/forms.py:106 msgid "" From ee7c6373fc5f4cff7bc6ade296a9e96f92e82567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 27 Mar 2024 11:55:34 +0000 Subject: [PATCH 06/30] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.8% (1148 of 1554 strings) --- plinth/locale/nb/LC_MESSAGES/django.po | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index a18f2d2d4..dc9e9384c 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -16,8 +16,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2023-08-16 06:52+0000\n" -"Last-Translator: Petter Reinholdtsen \n" +"PO-Revision-Date: 2024-03-28 01:01+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb\n" @@ -25,7 +25,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.0-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: config.py:120 #, python-brace-format @@ -2091,9 +2091,9 @@ msgid "" "Postfix sends and receives emails. Dovecot allows email clients to access " "your mailbox using IMAP and POP3. Rspamd deals with spam." msgstr "" -"Dette er en komplett eposttjenerløsning som bruker Postfix, Dovecot og " +"Dette er en komplett e-posttjenerløsning som bruker Postfix, Dovecot og " "Rspamd. Postfix sender og mottar e-post. Dovecot gir e-postklienter tilgang " -"til din postkasse ved hjelp av IMAP og POP3. Rspamd håndterer spam." +"til din postkasse ved hjelp av IMAP og POP3. Rspamd håndterer søppelpost." #: modules/email/__init__.py:31 msgid "" @@ -2102,11 +2102,10 @@ msgid "" "restrict outgoing email. Some lift the restriction after an explicit " "request. See manual page for more information." msgstr "" -"Eposttjeneren virker for øyeblikket ikke med mange gratis domenetjenester, " +"E-posttjeneren virker for øyeblikket ikke med mange gratis domenetjenester, " "inkludert de som tilbys fra Freedombox-stiftelsen. Mange " "internettleverandører begrenser også utgående epost. Noen løfter på " -"blokkeringen etter eksplisitte henvendelser. Se manualsiden for mer " -"informasjon." +"blokkeringen etter eksplisitte henvendelser. Se manualsiden for mer info." #: modules/email/__init__.py:36 #, python-brace-format @@ -2128,7 +2127,7 @@ msgstr "" msgid "" "During installation, any other email servers in the system will be " "uninstalled." -msgstr "Enhver annen eposttjener vil bli avinstallert under installasjonen." +msgstr "Enhver annen e-posttjener vil bli avinstallert under installasjonen." #: modules/email/__init__.py:63 msgid "Postfix/Dovecot" @@ -2136,7 +2135,7 @@ msgstr "Postfix/Dovecot" #: modules/email/__init__.py:65 msgid "Email Server" -msgstr "Eposttjener" +msgstr "E-posttjener" #: modules/email/__init__.py:85 #, fuzzy From 0c47956c2a171cb24cfbe03ec3130e2fd1cb0781 Mon Sep 17 00:00:00 2001 From: Veiko Aasa Date: Wed, 27 Mar 2024 18:52:06 +0200 Subject: [PATCH 07/30] gitweb: Fix an issue when cloning existing repository Skip all the other git clone progress log lines. Fixes occasional `'total_progress' not defined` error. Tested in the testing container that cloning exisiting repository works. Signed-off-by: Veiko Aasa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/gitweb/privileged.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plinth/modules/gitweb/privileged.py b/plinth/modules/gitweb/privileged.py index 2248ec776..5d81d568f 100644 --- a/plinth/modules/gitweb/privileged.py +++ b/plinth/modules/gitweb/privileged.py @@ -145,6 +145,8 @@ def _clone_status_line_to_percent(line): total_progress = 10 + 0.6 * progress elif 'Resolving deltas' in text: total_progress = 70 + 0.3 * progress + else: + return None return str(int(total_progress)) From 1ad1eb266a3c9508e125cc3ea4c7b26e16914674 Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Fri, 29 Mar 2024 11:27:30 -0700 Subject: [PATCH 08/30] network: Skip of bridge interfaces in connections list Don't list the bridge interface in the Networks page as it is not meant to be modified by users and would only create confusion. Signed-off-by: Benedek Nagy --- plinth/network.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plinth/network.py b/plinth/network.py index d2efa1a9b..d545449af 100644 --- a/plinth/network.py +++ b/plinth/network.py @@ -228,6 +228,11 @@ def get_connection_list(): for connection in client.get_connections(): # Display a friendly type name if known. connection_type = connection.get_connection_type() + # Do not show bridge adapter as it is not meant to + # be modified by the user. + if connection_type == 'bridge': + continue + connection_type_name = CONNECTION_TYPE_NAMES.get( connection_type, connection_type) From c16953797509bcc8c5db713d7dee8c797084a138 Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Fri, 29 Mar 2024 11:50:46 -0700 Subject: [PATCH 09/30] action_utils: Add generic utils for managing podman containers Signed-off-by: Benedek Nagy [sunil: Rename methods] [sunil: yapf formatting] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/action_utils.py | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/plinth/action_utils.py b/plinth/action_utils.py index 4bf5a1a1b..c6286632b 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -487,3 +487,71 @@ def is_package_manager_busy(): return True except subprocess.CalledProcessError: return False + + +def podman_run(network_name, subnet, bridge_ip, host_port, container_port, + container_ip, volume_name, container_name, image_name, + extra_run_options=None, extra_network_options=None): + """Remove, recreate and run a podman container.""" + try: + service_stop(container_name) + subprocess.run(['podman', 'network', 'rm', '--force', network_name], + check=False) + finally: + network_create_command = [ + 'podman', 'network', 'create', '--driver', 'bridge', '--subnet', + subnet, '--gateway', bridge_ip, '--dns', bridge_ip, + '--interface-name', network_name, network_name + ] + if extra_network_options: + network_create_command.extend(extra_network_options) + # create bridge network + subprocess.run(network_create_command, check=True) + + run_command = [ + 'podman', + 'run', + '--detach', + # Only listen on localhost. This is to prevent + # exposing the host port to the internet + '--publish', + f'127.0.0.1:{host_port}:{container_port}', + '--network', + network_name, + '--ip', + container_ip, + '--volume', + f'{volume_name}:/var/www/html', + '--name', + container_name, + '--restart', + 'unless-stopped', + '--quiet', + # enable automatic updates + '--label', + 'io.containers.autoupdate=registry', + # If another container with the same name already + # exists, replace and remove it. + '--replace', + ] + (extra_run_options or []) + [image_name] + subprocess.run(run_command, check=True) + + systemd_content = subprocess.run( + ['podman', 'generate', 'systemd', '--new', container_name], + capture_output=True, check=True).stdout.decode() + pathlib.Path('/etc/systemd/system/' + '{container_name}.service').write_text( + systemd_content, encoding='utf-8') + service_daemon_reload() + + +def podman_uninstall(container_name, network_name, volume_name, image_name): + """Remove a podman container's components and systemd unit.""" + components = [('network', network_name), ('volume', volume_name), + ('image', image_name)] + for component in components: + subprocess.run(['podman', component[0], 'rm', component[1]], + check=True) + pathlib.Path('/etc/systemd/system/{container_name}.service').unlink( + missing_ok=True) + service_daemon_reload() From 3d8967a20ad7fa0caba542ac1ab033764af30e5f Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Wed, 20 Sep 2023 16:06:26 +0200 Subject: [PATCH 10/30] nextcloud: Add new app based on podman container Nextcloud has long been a desired app for FreedomBox, however, due to difficulties around Debian packaging, it hasn't yet been implemented. This branch creates an app for Nextcloud with the help of Podman. Podman is a containarization technology, like Docker, but with some extra features that make its integration into FreedomBox convenient. If the podman approach turns out to be favorable, we should consider writing a podman specific module. How does this work? The app installs the podman and default-mysql-server Debian packages. In other apps, such as MediaWiki, FreedomBox chooses SQLite which eases maintenance and backup/restore. However, this would bring a significant performance degrade for Nextcloud, hence the choice of Mysql. Other apps, like Wordpress already use Mysql, so it is installed on the host as opposed to installing it in a sepatate container. A firewalld rich rule is created, so the Nextcloud container can communicate with the db and OpenLDAP. The podman package comes with a systemd service and timer for automatically upgrading containers that are labeled as "io.containers.autoupdate=registry". podman-auto-update.timer is managed by FreedomBox. We might add a drop-in file for the timer to make it more consistent with unattended-upgrades. Podman natively supports creating systemd services for individual containers. The generated systemd service is then managed by FreedomBox. The current container image is based on Debian and runs apache inside the container. To avoid running apache redundantly (both on the host and inside the container) it would be preferable to use the nextcloud:stable-fpm image instead, which seems to require creating a new virtual host. Configure /.well-known URIs to redirect to /nextcloud. There is a conflict with Radicale if both apps are running. Put the podman1 interface into the trusted firewalld zone. This results in the container gaining Internet access which is necessary to downloading Nextcloud applications and federating with other Nextcloud instances. After applying the patches, I opened my instance to the Internet to make sure this configuration doesn't accidentally expose services. I scanned TCP ports 3306 and 6379 (after installing and binding redis-server to the bridge interface). After that, I installed the Tor app and put the default WAN interface to the external zone to confirm that port 9050/TCP does not get exposed through the bridge interface. To-do: * test the fpm image * test running the container in rootless mode for better security Signed-off-by: Benedek Nagy [sunil: Add missing docstrings] [sunil: Make some methods private to module] [sunil: Run yapf for formatting] [sunil: Remove a comment to hide form when app is disabled] [sunil: Update form labels] [sunil: I18N for client names] [sunil: Reduce number success messages in form for easy i18n and consistency] [sunil: Reorganize patch series, squash fixes] [sunil: Tweak auto update daemon component's ID] [sunil: Add blank lines for formatting] [sunil: Minor refactoring for _run_occ method] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- debian/copyright | 6 + plinth/modules/nextcloud/__init__.py | 123 ++++++++ .../conf-available/nextcloud-freedombox.conf | 25 ++ .../filter.d/nextcloud-freedombox.conf | 7 + .../fail2ban/jail.d/nextcloud-freedombox.conf | 4 + .../freedombox/modules-enabled/nextcloud | 1 + plinth/modules/nextcloud/forms.py | 21 ++ plinth/modules/nextcloud/manifest.py | 49 ++++ plinth/modules/nextcloud/privileged.py | 274 ++++++++++++++++++ .../nextcloud/static/icons/nextcloud.png | Bin 0 -> 11903 bytes .../nextcloud/static/icons/nextcloud.svg | 55 ++++ plinth/modules/nextcloud/urls.py | 10 + plinth/modules/nextcloud/views.py | 55 ++++ 13 files changed, 630 insertions(+) create mode 100644 plinth/modules/nextcloud/__init__.py create mode 100644 plinth/modules/nextcloud/data/usr/share/freedombox/etc/apache2/conf-available/nextcloud-freedombox.conf create mode 100644 plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/filter.d/nextcloud-freedombox.conf create mode 100644 plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/jail.d/nextcloud-freedombox.conf create mode 100644 plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud create mode 100644 plinth/modules/nextcloud/forms.py create mode 100644 plinth/modules/nextcloud/manifest.py create mode 100644 plinth/modules/nextcloud/privileged.py create mode 100644 plinth/modules/nextcloud/static/icons/nextcloud.png create mode 100644 plinth/modules/nextcloud/static/icons/nextcloud.svg create mode 100644 plinth/modules/nextcloud/urls.py create mode 100644 plinth/modules/nextcloud/views.py diff --git a/debian/copyright b/debian/copyright index 582f94643..dcf0cbb39 100644 --- a/debian/copyright +++ b/debian/copyright @@ -175,6 +175,12 @@ Comment: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg https://github.com/mumble-voip/mumble/blob/master/LICENSE License: BSD-3-clause +Files: plinth/modules/nextcloud/static/icons/nextcloud.png + plinth/modules/nextcloud/static/icons/nextcloud.svg +Copyright: 2016 Nextcloud GmbH. +Comment: https://nextcloud.com/trademarks/ +License: AGPL-3+ + Files: plinth/modules/openvpn/static/icons/openvpn.png Copyright: 2017 Kishan Raval Comment: https://github.com/thekishanraval/Logos diff --git a/plinth/modules/nextcloud/__init__.py b/plinth/modules/nextcloud/__init__.py new file mode 100644 index 000000000..c71e80c6b --- /dev/null +++ b/plinth/modules/nextcloud/__init__.py @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""FreedomBox app to configure Nextcloud.""" + +from django.utils.translation import gettext_lazy as _ + +from plinth import app as app_module +from plinth import frontpage, menu +from plinth.config import DropinConfigs +from plinth.daemon import Daemon, SharedDaemon +from plinth.modules.apache.components import Webserver, diagnose_url +from plinth.modules.firewall.components import (Firewall, + FirewallLocalProtection) +from plinth.package import Packages + +from . import manifest, privileged + +_description = [ + _('Nextcloud is a self-hosted productivity platform which provides ' + 'private and secure functions for file sharing, collaborative work, ' + 'and more. Nextcloud includes the Nextcloud server, client applications ' + 'for desktop computers, and mobile clients. The Nextcloud server ' + 'provides a well integrated web interface.'), + _('All users of FreedomBox can use Nextcloud.'), + _('To perform administrative actions, use the ' + f'"{privileged.GUI_ADMIN}" user.'), + _('You can set a new password in the "Configuration" section below.'), + _('Please note, that Nextcloud isn\'t maintained by Debian, which means ' + 'security and feature updates are applied independently.') +] + + +class NextcloudApp(app_module.App): + """FreedomBox app for Nextcloud.""" + + app_id = 'nextcloud' + + _version = 1 + + configure_when_disabled = False + + def __init__(self): + """Create components for the app.""" + super().__init__() + + info = app_module.Info( + app_id=self.app_id, version=self._version, name=_('Nextcloud'), + icon_filename='nextcloud', + short_description=_('File Storage & Collaboration'), + description=_description, manual_page='Nextcloud', + clients=manifest.clients) + self.add(info) + + menu_item = menu.Menu('menu-nextcloud', info.name, + info.short_description, info.icon_filename, + 'nextcloud:index', parent_url_name='apps') + self.add(menu_item) + + shortcut = frontpage.Shortcut('shortcut-nextcloud', info.name, + short_description=info.short_description, + icon=info.icon_filename, + url='/nextcloud/', clients=info.clients, + login_required=True) + self.add(shortcut) + + packages = Packages('packages-nextcloud', + ['podman', 'default-mysql-server'], + conflicts=['libpam-tmpdir'], + conflicts_action=Packages.ConflictsAction.REMOVE) + self.add(packages) + + dropin_configs = DropinConfigs('dropin-configs-nextcloud', [ + '/etc/apache2/conf-available/nextcloud-freedombox.conf', + '/etc/fail2ban/jail.d/nextcloud-freedombox.conf', + '/etc/fail2ban/filter.d/nextcloud-freedombox.conf', + ]) + self.add(dropin_configs) + + firewall = Firewall('firewall-nextcloud', info.name, + ports=['http', 'https'], is_external=True) + self.add(firewall) + + firewall_local_protection = FirewallLocalProtection( + 'firewall-local-protection-nextcloud', ['8181']) + self.add(firewall_local_protection) + + webserver = Webserver('webserver-nextcloud', 'nextcloud-freedombox', + urls=['https://{host}/nextcloud/login']) + self.add(webserver) + + daemon = Daemon('daemon-nextcloud', 'nextcloud-fbx') + self.add(daemon) + + daemon = Daemon('daemon-nextcloud-timer', 'nextcloud-cron-fbx.timer') + self.add(daemon) + + daemon = SharedDaemon('shared-daemon-podman-auto-update', + 'podman-auto-update.timer') + self.add(daemon) + + daemon = SharedDaemon('shared-daemon-nextcloud-redis', 'redis-server', + listen_ports=[(6379, 'tcp4')]) + self.add(daemon) + + daemon = SharedDaemon('shared-daemon-nextcloud-mysql', 'mysql') + self.add(daemon) + + def setup(self, old_version): + """Install and configure the app.""" + super().setup(old_version) + privileged.setup() + if not old_version: + self.enable() + + def uninstall(self): + """De-configure and uninstall the app.""" + privileged.uninstall() + super().uninstall() + + def diagnose(self): + """Run diagnostics and return the results.""" + results = super().diagnose() + results.append(diagnose_url('docker.com')) + return results diff --git a/plinth/modules/nextcloud/data/usr/share/freedombox/etc/apache2/conf-available/nextcloud-freedombox.conf b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/apache2/conf-available/nextcloud-freedombox.conf new file mode 100644 index 000000000..8d3758f54 --- /dev/null +++ b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/apache2/conf-available/nextcloud-freedombox.conf @@ -0,0 +1,25 @@ +## +## On all sites, provide Nextcloud on a default path: /nextcloud +## +## Requires the following Apache modules to be enabled: +## mod_headers +## mod_proxy +## mod_proxy_http +## + +# Redirect .well-known URLs on the server to Nextcloud to enable auto-discovery +# of calendars, contacts, etc. without having to provide full server URLs. If +# another app providing similar functionality is enabled, only one of them will +# work based on the sort order of Apache configuration files. +Redirect 301 /.well-known/carddav /nextcloud/remote.php/dav +Redirect 301 /.well-known/caldav /nextcloud/remote.php/dav +Redirect 301 /.well-known/webfinger /nextcloud/index.php/.well-known/webfinger +Redirect 301 /.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo + + + ProxyPass http://127.0.0.1:8181 + + ## Send the scheme from user's request to enable Nextcloud to redirect URLs, + ## set cookies, set absolute URLs (if any) properly. + RequestHeader set X-Forwarded-Proto 'https' env=HTTPS + diff --git a/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/filter.d/nextcloud-freedombox.conf b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/filter.d/nextcloud-freedombox.conf new file mode 100644 index 000000000..7f2f0ad4b --- /dev/null +++ b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/filter.d/nextcloud-freedombox.conf @@ -0,0 +1,7 @@ +[INCLUDES] +before = common.conf + +[Definition] +_daemon = apache-access +prefregex = %(__prefix_line)s +failregex = \S+ (?::\d+)? - \S+ \[[^\]]*\] "GET /nextcloud/login\?direct=1&user=\S+ HTTP/\S+" 200 diff --git a/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/jail.d/nextcloud-freedombox.conf b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/jail.d/nextcloud-freedombox.conf new file mode 100644 index 000000000..a634a6ef9 --- /dev/null +++ b/plinth/modules/nextcloud/data/usr/share/freedombox/etc/fail2ban/jail.d/nextcloud-freedombox.conf @@ -0,0 +1,4 @@ +[nextcloud-freedombox] +enabled = true +filter = nextcloud-freedombox +journalmatch = SYSLOG_IDENTIFIER=apache-access diff --git a/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud b/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud new file mode 100644 index 000000000..4a1247e87 --- /dev/null +++ b/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud @@ -0,0 +1 @@ +plinth.modules.nextcloud diff --git a/plinth/modules/nextcloud/forms.py b/plinth/modules/nextcloud/forms.py new file mode 100644 index 000000000..d2c0dcb64 --- /dev/null +++ b/plinth/modules/nextcloud/forms.py @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Nextcloud configuration form.""" + +from django import forms +from django.utils.translation import gettext_lazy as _ + + +class NextcloudForm(forms.Form): + """Nextcloud configuration form.""" + + domain = forms.CharField( + label=_('Domain'), required=False, help_text=_( + 'Examples: "myfreedombox.example.org" or "example.onion".')) + + admin_password = forms.CharField( + label=_('Administrator password'), help_text=_( + 'Optional. Set a new password for Nextcloud\'s administrator ' + 'account (nextcloud-admin). The password cannot be a common one ' + 'and the minimum required length is 10 characters' + '. Leave this field blank to keep the current password.'), + required=False, widget=forms.PasswordInput, min_length=10) diff --git a/plinth/modules/nextcloud/manifest.py b/plinth/modules/nextcloud/manifest.py new file mode 100644 index 000000000..005bea377 --- /dev/null +++ b/plinth/modules/nextcloud/manifest.py @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Application manifest for Nextcloud.""" + +from django.utils.translation import gettext_lazy as _ + +from plinth.clients import store_url + +_nextcloud_android_package_id = 'com.nextcloud.client' + +clients = [{ + 'name': _('Nextcloud'), + 'platforms': [{ + 'type': 'web', + 'url': '/nextcloud/' + }] +}, { + 'name': + _('Nextcloud'), + 'platforms': [{ + 'type': 'download', + 'os': 'gnu-linux', + 'url': 'https://nextcloud.com/install/#install-clients' + }, { + 'type': 'download', + 'os': 'macos', + 'url': 'https://nextcloud.com/install/#install-clients' + }, { + 'type': 'download', + 'os': 'windows', + 'url': 'https://nextcloud.com/install/#install-clients' + }, { + 'type': 'store', + 'os': 'ios', + 'store_name': 'app-store', + 'url': 'https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8' + }, { + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', _nextcloud_android_package_id) + }, { + 'type': 'store', + 'os': 'android', + 'store_name': 'f-droid', + 'url': store_url('f-droid', _nextcloud_android_package_id) + }] +}] + +backup = {} diff --git a/plinth/modules/nextcloud/privileged.py b/plinth/modules/nextcloud/privileged.py new file mode 100644 index 000000000..ec8ae4a4e --- /dev/null +++ b/plinth/modules/nextcloud/privileged.py @@ -0,0 +1,274 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Configure Nextcloud.""" + +import os +import pathlib +import random +import string +import subprocess +import time + +from plinth import action_utils +from plinth.actions import privileged + +NETWORK_NAME = 'nextcloud-fbx' +BRIDGE_IP = '172.16.16.1' +CONTAINER_IP = '172.16.16.2' +CONTAINER_NAME = 'nextcloud-fbx' +VOLUME_NAME = 'nextcloud-volume-fbx' +IMAGE_NAME = 'docker.io/library/nextcloud:stable-apache' + +DB_HOST = 'localhost' +DB_NAME = 'nextcloud_fbx' +DB_USER = 'nextcloud_fbx' +GUI_ADMIN = 'nextcloud-admin' +SOCKET_CONFIG_FILE = pathlib.Path('/etc/mysql/mariadb.conf.d/' + '99-freedombox.cnf') +SYSTEMD_LOCATION = '/etc/systemd/system/' +NEXTCLOUD_CONTAINER_SYSTEMD_FILE = pathlib.Path( + f'{SYSTEMD_LOCATION}{CONTAINER_NAME}.service') +NEXTCLOUD_CRON_SERVICE_FILE = pathlib.Path( + f'{SYSTEMD_LOCATION}nextcloud-cron-fbx.service') +NEXTCLOUD_CRON_TIMER_FILE = pathlib.Path( + f'{SYSTEMD_LOCATION}nextcloud-cron-fbx.timer') + + +@privileged +def setup(): + """Setup Nextcloud configuration.""" + database_password = _generate_secret_key(16) + administrator_password = _generate_secret_key(16) + _configure_db_socket() + _configure_firewall(action='add', interface_name=NETWORK_NAME) + _create_database(database_password) + action_utils.podman_run( + network_name=NETWORK_NAME, subnet='172.16.16.0/24', + bridge_ip=BRIDGE_IP, host_port='8181', container_port='80', + container_ip=CONTAINER_IP, volume_name=VOLUME_NAME, + container_name=CONTAINER_NAME, image_name=IMAGE_NAME, + extra_run_options=[ + '--env=TRUSTED_PROXIES={BRIDGE_IP}', + '--env=OVERWRITEWEBROOT=/nextcloud' + ]) + # OCC isn't immediately available after the container is spun up. + # Wait until CAN_INSTALL file is available. + timeout = 300 + while timeout > 0: + if os.path.exists('/var/lib/containers/storage/volumes/' + 'nextcloud-volume-fbx/_data/config/CAN_INSTALL'): + break + timeout = timeout - 1 + time.sleep(1) + + _nextcloud_setup_wizard(database_password, administrator_password) + # Check if LDAP has already been configured. This is necessary because + # if the setup proccess is rerun when updating the FredomBox app another + # redundant LDAP config would be created. + is_ldap_configured = _run_occ('ldap:test-config', 's01', + capture_output=True) + if is_ldap_configured != ('The configuration is valid and the connection ' + 'could be established!'): + _configure_ldap() + + _configure_systemd() + + +def _run_occ(*args, capture_output: bool = False): + """Run the Nextcloud occ command inside the container.""" + occ = [ + 'podman', 'exec', '--user', 'www-data', CONTAINER_NAME, 'php', 'occ' + ] + list(args) + return subprocess.run(occ, capture_output=capture_output, check=False) + + +@privileged +def get_domain(): + """Return domain name set in Nextcloud.""" + try: + domain = _run_occ('config:system:get', 'overwritehost', + capture_output=True) + return domain.stdout.decode().strip() + except subprocess.CalledProcessError: + return None + + +@privileged +def set_domain(domain_name: str): + """Set Nextcloud domain name.""" + protocol = 'https' + if domain_name.endswith('.onion'): + protocol = 'http' + + if domain_name: + _run_occ('config:system:set', 'overwritehost', '--value', domain_name) + + _run_occ('config:system:set', 'overwrite.cli.url', '--value', + f'{protocol}://{domain_name}/nextcloud') + + _run_occ('config:system:set', 'overwriteprotocol', '--value', protocol) + + # Restart to apply changes immediately + action_utils.service_restart('nextcloud-fbx') + + +@privileged +def set_admin_password(password: str): + """Set password for owncloud-admin""" + subprocess.run([ + 'podman', 'exec', '--user', 'www-data', f'--env=OC_PASS={password}', + '-it', CONTAINER_NAME, 'sh', '-c', + ("/var/www/html/occ " + f"user:resetpassword --password-from-env {GUI_ADMIN}") + ], check=True) + + +def _configure_firewall(action, interface_name): + subprocess.run([ + 'firewall-cmd', '--permanent', '--zone=trusted', + f'--{action}-interface={interface_name}' + ], check=True) + action_utils.service_restart('firewalld') + + +def _configure_db_socket(): + file_content = f'''## This file is automatically generated by FreedomBox +## Enable database to create a socket for podman's bridge network +[mysqld] +bind-address = {BRIDGE_IP} +''' + SOCKET_CONFIG_FILE.write_text(file_content, encoding='utf-8') + action_utils.service_restart('mariadb') + + +def _create_database(db_password): + """Create an empty MySQL database for Nextcloud.""" + # SQL injection is avoided due to known input. + _db_file_path = pathlib.Path('/var/lib/mysql/nextcloud_fbx') + if _db_file_path.exists(): + return + query = f'''CREATE USER '{DB_USER}'@'{CONTAINER_IP}' +IDENTIFIED BY'{db_password}'; +CREATE DATABASE {DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +GRANT ALL PRIVILEGES ON {DB_NAME}.* TO '{DB_USER}'@'{CONTAINER_IP}'; +FLUSH PRIVILEGES;''' + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=True) + + +def _nextcloud_setup_wizard(db_password, admin_password): + admin_data_dir = pathlib.Path( + '/var/lib/containers/storage/volumes/nextcloud-volume-fbx/' + f'_data/data/{GUI_ADMIN}') + if not admin_data_dir.exists(): + _run_occ('maintenance:install', '--database=mysql', + f'--database-name={DB_NAME}', f'--database-host={BRIDGE_IP}', + '--database-port=3306', f'--database-user={DB_USER}', + f'--database-pass={db_password}', f'--admin-user={GUI_ADMIN}', + f'--admin-pass={admin_password}') + # For the server to work properly, it's important to configure background + # jobs correctly. Cron is the recommended setting. + _run_occ('background:cron') + + +def _configure_ldap(): + _run_occ('app:enable', 'user_ldap') + _run_occ('ldap:create-empty-config') + + ldap_settings = { + 'ldapBase': 'dc=thisbox', + 'ldapBaseGroups': 'dc=thisbox', + 'ldapBaseUsers': 'dc=thisbox', + 'ldapConfigurationActive': '1', + 'ldapGroupDisplayName': 'cn', + 'ldapGroupFilter': '(&(|(objectclass=posixGroup)))', + 'ldapGroupFilterMode': '0', + 'ldapGroupFilterObjectclass': 'posixGroup', + 'ldapGroupMemberAssocAttr': 'memberUid', + 'ldapHost': BRIDGE_IP, + 'ldapLoginFilter': '(&(|(objectclass=posixAccount))(uid=%uid))', + 'ldapLoginFilterEmail': '0', + 'ldapLoginFilterMode': '0', + 'ldapLoginFilterUsername': '1', + 'ldapNestedGroups': '0', + 'ldapPort': '389', + 'ldapTLS': '0', + 'ldapUserDisplayName': 'cn', + 'ldapUserFilter': '(|(objectclass=posixAccount))', + 'ldapUserFilterMode': '0', + 'ldapUserFilterObjectclass': 'account', + 'ldapUuidGroupAttribute': 'auto', + 'ldapUuidUserAttribute': 'auto', + 'turnOffCertCheck': '0', + 'turnOnPasswordChange': '0', + 'useMemberOfToDetectMembership': '0' + } + + for key, value in ldap_settings.items(): + _run_occ('ldap:set-config', 's01', key, value) + + +def _configure_systemd(): + systemd_content = subprocess.run( + ['podman', 'generate', 'systemd', '--new', CONTAINER_NAME], + capture_output=True, check=True).stdout.decode() + # Create service and timer for running periodic php jobs. + NEXTCLOUD_CONTAINER_SYSTEMD_FILE.write_text(systemd_content, + encoding='utf-8') + nextcloud_cron_service_content = ''' +[Unit] +Description=Nextcloud cron.php job + +[Service] +ExecCondition=/usr/bin/podman exec --user www-data nextcloud-fbx php occ status -e +ExecStart=/usr/bin/podman exec --user www-data nextcloud-fbx php /var/www/html/cron.php +KillMode=process +''' # noqa: E501 + nextcloud_cron_timer_content = '''[Unit] +Description=Run Nextcloud cron.php every 5 minutes + +[Timer] +OnBootSec=5min +OnUnitActiveSec=5min +Unit=nextcloud-cron-fbx.service + +[Install] +WantedBy=timers.target +''' + NEXTCLOUD_CRON_SERVICE_FILE.write_text(nextcloud_cron_service_content) + NEXTCLOUD_CRON_TIMER_FILE.write_text(nextcloud_cron_timer_content) + action_utils.service_daemon_reload() + + +@privileged +def uninstall(): + """Uninstall Nextcloud""" + _drop_database() + _remove_db_socket() + _configure_firewall(action='remove', interface_name=NETWORK_NAME) + action_utils.podman_uninstall(container_name=CONTAINER_NAME, + network_name=NETWORK_NAME, + volume_name=VOLUME_NAME, + image_name=IMAGE_NAME) + files = [NEXTCLOUD_CRON_SERVICE_FILE, NEXTCLOUD_CRON_TIMER_FILE] + for file in files: + file.unlink(missing_ok=True) + + +def _remove_db_socket(): + SOCKET_CONFIG_FILE.unlink(missing_ok=True) + action_utils.service_restart('mariadb') + + +def _drop_database(): + """Drop the mysql database that was created during install.""" + query = f'''DROP DATABASE {DB_NAME}; +DROP User '{DB_USER}'@'{CONTAINER_IP}';''' + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=True) + + +def _generate_secret_key(length=64, chars=None): + """Generate a new random secret key for use with Nextcloud.""" + chars = chars or (string.ascii_letters + string.digits) + rand = random.SystemRandom() + return ''.join(rand.choice(chars) for _ in range(length)) diff --git a/plinth/modules/nextcloud/static/icons/nextcloud.png b/plinth/modules/nextcloud/static/icons/nextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..27eadda874dfd73fbff03582f09a2e4a143c081b GIT binary patch literal 11903 zcmd^_Wm_Cgw614x_u%gC?(P;KNbukg9D)xJoWb3KYp`G;KyY`5po0c?88n=E_x=m# z+x{?D*VWxqZB@0Nb+0EzTT=-WjT8+40AQ*p%j*CDKv)w9KtY0SOgt)WVH;F8Wg|}j z0NL`tA27ZD*H73^5-$ZqFI`t#FCR+}8-S0G52u5Rlc$xXn+>O{hh6TuI4J-?4N#Gn z(euqa`{om9yuUcyeUSW(;tL#bj9ILiK$)HaVeU5zTX^FbJHbbNbXTH)KaH&8Dkx1e zbGRQBi^{eDHt(1n+(R)&d9-~|bMZbZ%7zl~Qk>*Nu}9gilB_oZY#;~Ek9+thPm%}Z zqtJi1>vnl`-(v?qp)w9#0N4q^!G^#ehH!E30APlm|D#Ry2nf({T?r5KogT(2*6`;r zy|{tdqC&Y44IIp(YZ1j|IeWzKC!ud!H6OoUv9P@+Z0v9re+La)u;B7`IOs05oF?)- zmrQk4o`(OR`@w<3+P7EH(?PBF-fT#CIvG`>;_AvZliv;OY6v_WRxWm6Q~#?S-v6Ev zt^=?WdZHDo8185P*F9b%a1_3Pkmv{8%yd$_Lcn%bs&oYnZ~is$uphQB+%}N6nritW zjj$WOaWCp!2q?tl?(}a>y*N;qVh`~9F@q~ZOZxApJh2wmry5AFq5lw?Gzs14f^fK+ zwg@5do{u;p-S6oByTj-X0m+{$7jEoiR)~cd$s|?q?t8ozqWiDT1zh9WpuxhwWOvu_ zQg>p+YGV3;F_bEeS8Up4!0t=JAcH=j$xR;61j^S1xeHe>PfFhgqy8rP&<80}$)v({VxeU_iLv%t7aNAW}5!-$U$-n>x$8vYJ| zoh!X;RIe@(dZJL){sFgztJ8YOys!@Z{MUzlKXG$#rU)_*h8per z(8E)(0XXSUF;cqFwm*H&lnM?f!WGe}?t8lyOACcf0HWl96q&3KJ|X$1KJ2e)*dY$2 z;FtajX(U#CfQjsXPvW#Rg@^?e%K%MP^vsfi#dm$E;c;P|QX5Egh)kv@(&1f+WdQp~ z?%oP-NU*bJ0SM_p&zgHOrfl0jo-qb zD8t$snPDkx>vk_>%TQe1YZPO(Iq&-*7fg3&2xx3OiaY~*;Be#q!L%{3kk4n-2daf+ zO6R!cA??f>5Cj_VsPOAqL@vS)KTwPV4)BvkNzuDceW>AN8{OG2Kg_uIWQI2MT#9Sd zAZ(8On~&(>JAFJyH#<*sGX>Dka>J2;_=}l-W;?< zkK1C{OF-Aq->APar&Q(jzXnE%k_^Pjlf)jQV5}X;`w>~N1^1t4w7T))#%sL{I1Q)R z6Mw~!Lg;U(q(qHlZ2(V)b_1b1HK38RftothkO}*|xRN*YKnmjH*wpw(ggqZ++XQ_r z-$A+pWnORIkqxuQ@i3o|icmW@+3CJt%K{0ymAKjIn<;l5fJ2!c`f%n!1|o0Zx2PuD z9D}1_`i2L!tO*h73ZSv?HohU|HO?W|dJZB>6+k&CDB9qQDCI0T#BCIVC;=`Q$=05| zaYjQaMfof&8F3GC<_RuihSK^c4i#&-2qzg$C(_P)h>yh-rd~-=ZQqfCf32RRSU*wE zut{SLPe+)1cSv$taXNY}3zTQh1}K{zYwOh^-*d+FrW7S^yEP1zsHr*|)#Xd2c&AUN zo^d{hew~o}m4AGRZlOPQVh9W-%T8VuZUAQ-*qH)Rh*v;P#_%Xop7BHWDeABU61k8 zat$Mhha_tzF!u?kkC&CTyT;%Y`kp1uX1FGDQeL>A(Qo|-%@0M1^Ux_iQW7Y0k|A?j(eMYUZ7 zCXo?h?cdCN4!_tn#Xf>Zs)xvNeY^FeiEk7jLRy43_hjL$_eJNKZ}ER|ir{Be29*B1 za*Cd^**bLyCYk3ot;RCUafPo^JBu89+cwGvb%G~@(B=D zjX|xe)Gp$#nKz;O>pQx7-9-Yk71z#5K0ZpvgcK2n1th{kQazi(@1|8hZP)p=YS;DU z=9W1sM!Gl$APctwIX3g3N_<))H3tD^ zOGhJG;?WABH!Y0U#@K;=U-c<|5LmKqfxb}f59IrMr5JLP;`@{TnYuH4vEuH7=Phyf zaAmq@2Ba7^<2(L^lT#)9_}GZfaYB_QFPC}oAq5QW&kZdG3lKi0BZI^hs_EY3Z=HHP zGEF0rW(G}PW$`fOxZfpiLHanjNMcJo8DZOQQC1ns_2OVTFmMho+}mo4Ooy8<6Z)og z?w`y@pWNBSz!Pjdle>Oru$0HpQYF{^G^hwiZ7@w0!#(_(HI_3uDlFv`z>qiB-xj3w zOJ^5<(|u8?ZM){pym9gC#twS;oGySny&E9tGi%UB7d??I->(?sBX|z1A=8t4GeSS3 zeZs6V4*W5poH#uB6f_3Mo1AOfWL|C`IQQJca4tIQy5IGf@MTf!&4S6=@GcTrtQH|{ z;Ki9I-F3$lF7cYN1ECdoJIv{)om4s07tguE<ncm2Cm}zo*sjTe^8sYRN zaCg+!y?%WWQQTRZtgrv-M{)~4lZZ3AHNqU1ptwTu2m3;Z5>xJ0bt|eCdDS0~V!w`5 zqITudQt(wg?wG1-kE_$>CB6N2iaKidFdJo8B6e1TVB%MyLI30(oDN3#k;o!HZR@sh zB2=(Eb&@CHslQ-yt%3O_cC^26~=`!+9Z zltr2l$xCaC%)<|}y%#aEO5Tlad!$)&UN|118=$oeA1?}o4nd=JyzrucQFZN!pHYAO zi!7c{EWrnNJ_7kAw?*P35)~gASLmr+JnQ!S$ye->Ru>4U-zeM%uNXC%YXr6fR4v(= z5SnmbMOS+B{|!{ceQtwXP>&(TYZ-x6-;at1?(wBLe8g}2t%v%tnbAWiK{2#d)v_M> zi>2bO%nU1l*2V7r5rv6QV|Uk#qs6i|;U7sdK2U2;E)!uJx6@*Ww7Z{~P2IK*LPOBw zFRwL|GlE|xSaWrVNAAhI;!kwGeduM655V%CU3A1yvJc$JbrBhP7cV}|@yswh%k+v> zbUO065#ZY19i$|pR9zD6J{cJJvbIHz`3uTGv+{XZ(UyH3%iHt2ysg6r>xO{)CTo1U zV=I?u7NDxapm=u}vk<@JPm+fYi2H4Vc&R|L*!q2O11d{e^@e9prj6}9u^b~oZzoH1 zS)6^_6vG4RpfX{dbi?!VRmOW^hRjFNKc`UqX9_e*+z9J1NwI8HIxbH_Wm| z4GU0vcWopjG_=(&3QbNSVkY6P^wpoLWlme;r}W$4^SN@bmN_x;v>zFlP27lTj_SD96V)|c6R+}_#NNCa{668^B zh^fms}`u`(h{QS&^XDoJkakTF?hWMTIhbm7|jYaMj;jVR^n zcd2(UjX~w$Bu8J6v`!a;{X3(rl#NMDmv>*hE>DfB&|hvh$O;}Qq_cJF3KD~t(*mG# zj7Y6$qNKaKbDAs=n=;l{=f&dI=(H+8CG4>K`gLbjZ!L>-g}nDLSa#eeIHbNnO{#}w zzWdw5qYrx9T{dx;u_@=STGb)@$Du{A`p7q>y3nsbVjwhLF?9b-r>)o9^WU7@oao}e zujPWAveRu`aBjtN;tD<`Gu-YdI+9kcH@ z7rIZ3200*X7+;NZy~LCFl7Hj+c&wqy$e_bKo4XVZ9yCq)FsnX3LmR~mp zu?#TGYR^8$FnDAtJ11(NFM5wX(?anLpk--ruVz0-qJ>8C%2ks{q2xaXsLMwMkbel- z{_+vBR<47K4ES3we4jSZ$MJ$y%>EwhQY_qzSf+BW`git^2@!0AZtl`i`@3JQJuU74 zX{WNf(L2W)olHsIOx@abR2mwt?-)?F(k{txp~cMS$ZL)&C-HS>A)U-sO#ba+@N$dj z^|XnZhc`zD>JNq-KUtU<>e!dY1K%sPkzMGpK`~2AmmJXf>o0K1gVQc}D>rl5h%V4l z>{rp!mE61)<*A~U(kxgN?D!{BO}XD;x6#1C);}UEO2nt>m-eycPI9s%BI`ZkZaLEB@VcuSizc?pS2G37ls;BSKVMa+iVV0a|?whzw!S9(%b98IWLLf?!tPfE(_kf*B6`;?=wk*ou^V9d#Y)2pe}Bz!=; zmIJVJ!=?hT7J8FLPv)8=Z#64aOHTwcN;yIvv3(=aZ@(0mpIiY&X$y|b9Q9T@@?RLC2Zbffeo zxV1r`@ce%j*%(W-C!-tr=JE$N0S;yR>2>PQg~`^(DoJ6l2_=cbJtk?!B-wuLt$MyX z=2Sb26m-lL)Oqnfh<<#+Q+2gvUXpjKMmIQDr{@kCfqjFxjH11#HYG9Q(41vMhg^TO5?L$z!rB+Vzfs1;^)FZ%uA4{ zZ82=cfylR8!t=EJLioUWVt_ z_&a6$`h?CY&5c8otAw@Agzul<*8w~`z?8CC6D^#pTu!BeK{a5Q^y{zm%^d1jfA6w! zne4fHU|&%d+o<{dh(zl>el{2%gaq|yf>+O6y=8&@Nsa!h&o=sH-IQtS+d}w-g5S~y zsn@W?8Esf37s3O?Q~e-MrwYK=U1>yO@~r#nNRGUpSm%%Lk|sZ|U-!f;q<$m7ndlol za5y$hKwvdBG|6lH3inzxH0*pkxVf*~z7!seExzNgZUZ*itjZ{gbQ#>>-7DeF7Gs#b zuoJwNg#|^pDUZdNF{;~j_Y+_Mr zfb0?GmDqj?byF8TYQ%;l%R5rZ2ZKAtfASH}AGs=fKlpC}iGniNF1EtkO+Dvo0k9Cm zBy(Ae~Eu+Yw+#m2if*I{4`Jz?C?$m_38E8Sl{{k@!sgCt&zbuNKy zV*0XwE9=_-)!zQuU+{fEOmp3Jfwr0$CUBc_kwGDKpsEks74J1V$it}pD;79J$84nX z>6+$@@xJ@wxdquVlN>dEuN#7zhNfmC1@8G{{7aRAfd`Gis)|(qpuY<_$`Xen4F9!GSRVgo$IlM)Q-X@tAVW-DF+55- zU5Lu6p)1}zSt(_nt~-@DG(Z2w(r&%TP_&wN=l z&f_;Ksy97ze93j=JmbLPW`^15)OvyZlbyf4QPvkXnXZM^qws z%B}mCAwww5f-mqpUq~-yo2iV#{<;4k2vGu}R_uT*o2~Rdc5~8z@ddeL*zrSip@J6T zw3yR}2Zy`~gq}&0ujjPuGK~BUS-DgpaVA)SCaZ=1vgMYy3{@IbC*P)bl1SpsdrA+A z{5du^UZ@uc{BPjx1J^sO^|j<5I>{{koy5a3w;1MtbJ38f849x{=_pjzvRj z0HD%_k&7os<&>&anR8AV^@wXGd9KCdLo&&Sb3zq-Sar ziCh`7Me+BL##%&YhnfpT!OpBHwcvcTGJBvsUy_M9YF=(={q1Pd$%vfrBvV7GZ<=>a$%bO}*(F@IL+!LVSWl6@c_Ua9a74lsue`GB|=JmE%y zdy_rCxcvGLvkE~xb9TUxpWrPqX^J1-1(+EGeyHA@b2*2p46S*v{7Lr;Z|h^x#d7J}Miwm8#b2_RJ{atz2 z3#UY6ReFH)(EoCU1E3VbPqyssonk-KyzJ9Qmmt@b$fvzBmsx@Z@tAHA0s>#sJ+r(! z&yC}E|AkJ;g|Os_80z62{lT2y@H;NG3BNMXB%cR=&a*_D=_7@OzbWojSnI!j+|||3 z7_(PFES$9eG)ir~&r*0mhsV+ucJ2VARJ6ug+-7PwnLB|?QGXSNo*H6VhuF#dOBmt9 zAZga-+O+$?6WN%XN|-o!XuVaq-fZMYAb{(au+4#dpW$CkUngCurXja)Vj;R28-%u) zyHdWBI4F4l4QGR!8I>`e=S&hI5uPnew;9r4zq$g_D!p(T{M)B}jV*aCa29JJn6JcSEjCo5-06mL7ijbbeunC5T(r z2}&Y_S?Wi~J@2-u3ZW^e8zuiS+&>^D6QU5!Dcka&L)+Bk*%<2V*Kp4$zPR?Xex!?b z{FHY=Ms|V@4u@PQ$WJh$W{2sPHAFl8KoL!E_9ssJCRA8`YQJ_JnVG-7A8iYBCSv78 z;*2Q&_Gv~C&Z9hTT7DLnCX@Dd_*+n9}PJWVA&w%D7H+D=2Y}BDW z=le<+5*qp6H8@V*5^CX09C-^Xyfgpw>5zwxNbfShCN7ob9{1Oli*;x6q^7e;bN?E^ zuMqu+Hw9&EgnStF1onvPbyYQ7p25H-P6ON)p1+M3$<*;EHG_Ew0kwYdlXopDK4bS-S;G}~Q-a;o-%cLur2K@XL2KwpQ2w^0ct!=YsQhLSi$vvhlI#8>+KM{sawHx5H zk(5pSS;txs>`<>*(+WzePgL7l7IlPSup0qbBp4*#xA>51G>raH+GUW&1^ICdo(*6V zNlzMyL;3}2OrggGG^|UjAGVpGXVPss$_ef^1TyP-RJA1b&Z^-sK2T^SvmKZg&n=vrdw~wBDhQqwmoK1hx_AA;-yQr3 z(ISL8CK8QUR4_MZEDrt^jn*7tBeIL*@gIgY%O$U{Mzpw+?TjZW#77}Uw)G+UT?jCN zJ_F@hoZphW|gB<$dT(De6=R6Y#QyP5gxMcavtjkA+h3yp@`*45hCM zDe;+fq_TS~wP;+IV)_4K7s{%&Hwf+fjBdnW^3;8;LP-L!fliDNF8#ff)7u_$Dq`8# zU_g7i0exT(lG9SE>Ysf~Q4b!xuz%th^Gdpr0f8~3M$t1t;&3RAE~&6wK-Eg4l>Q5Q zP*K|%le-|4Cjpco>MRw@w~n5eFAn!P&P9#+)^jWO-@`>POyyyOpM+xUlfER3 z&b?i^;%JK~IFd;m{l!2DAMGLRVdj=$p>=d8kwPexK(9LFqK6S5s!xXy=KF?W9lRHu zkZypQr<7|biC2dOmpyn8`!^9_n=dXO$+{8w7ANKC!k;o~@Y9tYj&^nNw5szHV>r4; zR9*T&pC4(#L%9LZNX>1A^#rJrkJJmn@gMl`Ic|h~37xTyWn>AqdQVX-7gJEVqQx`K z@=u(|=B!+Q0z(z^C~!#-6J)GK`l3EJ4yrwcnJ)X0PQy;m5P7D}=BXr!Z={^?SnyNZ zO&^@QXoOP&6<%FNbv~)FuNEXd(u{3q zEy0zbDc?&W>IXKerX2ZIZYpZr7Ij4%CpLs==SsqDlUuNI<2k=Ig``TbWd9=?E0~?p zg0bPn-)GALX5q*0dhCRY=+GS2Z0WMwN%pK~_Vq?W{T23hH($%Y$d!@uot_AP-n@TA z+hS%PuSv3g;v~;bo`y_t1m+^nJfyV$7OYNh3dxO=^A zMgf(=_*I>EwaU6A7n&?xfInsFza}F$mi;_?3)7?+uN+Bho$r5@0 z5W_D%@p7q|K4HTWM^-MT@8*a<5xyvX>{C#D^0q)vl5ki$^B2dLPpP73<$|w(->3!u z!FZ5VeA9B&jUpg2fLwWVg$yx?BkQbzq(QVXLqTe1uyoA`1v>kscl=qTJJo&3RmtXt zP`F*ljq=jNiBCRwz)5U#=}S zU3qb<^~j((_}e9Dv8-YzJRd%xG-&3|DjY%=h@D=7lZ|vuF_RnOBgPNGwho1@jW>Sg zkJR2(RNKPSh3&yn{jNnGbZ$tr^V%Y4w;d?m$daSqth6EP%uxM_zT4SCQYqn0!mrs^TzWI2#hLkZ@TE=6pE_v%Nx(Jl)U>1VohnnK zVbGTPj7@Knn}0vhs!}sY^6;w`(z9)P{2Rl08jQxC{Pbk(>mAkpQ*ew$XZaycKPq@7 zJqQ-pV3kzjBr*>rO~pAX>AgP6UDeW|PkS`0YW`fk?g?WzL2sJXbjt_sW=jV5ihiYG z_36^&Ot;l8LliEV2t+ul6j5UsjS>lO-1N6*U6KKD6`Vn+tOh>9w@9>^x)dO=9O?-G zfb~CKfWlm*coB~?aKBN<{WCL9V`u7Fub)XuysiMD3%i0z(BE_lE0l`nPQv5S5o`g< zqwnD0&V{my;&r6c5V~Mlzy6a)Zio-OW1uQJRt5YD`uj(`0#FKjgtJOHwruv|G1_8N z3uB;-mQZ%So2;VMESvVKtM4KS?1~$llM9Bo70k=cVt?UaZ)eWgBxd2B*e~z2k1_=6 zCOgkBd6jy;N&u$USqr13ekX@3yxfvG zQeav@i-^ECd@$S4CDYRaY~nMr zcoRTMaGc$)V9xLi^H}7lqOE?d$<%xzPnYr%=B<5hl95?y-%($MgoSLbx*wFlvBKYX5*5T3kEb}6~7WOc{)<^QIaKp z!%G9NVP9%U`Ov8DL`+I2x{6s;vRcP#ITdRG6Wei(UDM(L%*>3Qj4O8TA>SP8eizw? zC5U`Kv)k?pEO%+&s;2;*d-teJQ?ydr-3f&(9rdf~ou`r|JLz6Cy^A(x(475G zq_SF6{>opEyO(7DqtfXB$NzMtjjf|7NjCN=TwKrgd$YAGl^NIOwIwP?c7O9;o_FCQ z?Hr)RXa0owo5yn+ST6(3cY%PLsPpM_iuhe+4o}?gjaaw#Ti5xO^tBEP zE0S!H6T8#K%aLbdhiHQV=gwl({$QA1*4vK!)9`AS9pk>q`cNPod~WU8xtHEAT_4BU zKT3|(4C;?p6lv*a;cF4~_w2o>0yJ7tw;QhktzIS<@QX_T!G(*vo5xKW{l)i0jZKLG zs-h-DDbNR1CH}4pw8pT|e4Q_F0BOVnc&a@!XAQNRdNhZ8GBIY*OQDlliOr=_XF-O- zEK)oh3V#^A6c?=SIPZz`(FbjlKBhb}uzdV>CrDp~_m$*_%J~SR|6^#u{h!JK zWsmm+JkZ7~yFlXck1p?oH)`+h0H^o&9%dUna%&5E_QqQb%P)74u*ApVq$pVC_(U#f z6I%2cQZ)Z&p1QFdz^ zJY|(mwQW1pfrrVNEdYT12Va>A?_Jg=>HEVLOT`lhNNE#Y{i#>E817HHm<2{_-bA3- zK2}g9oszvbeTUbFej-|btti6f{cl9G%2B`(@y+0$8bMJ8R>=!h8~G=QjxMfmMp~Kj zjs?ZewKWg8XOOJw(VFgx6a2EELhZeguXbolB2n|3LzWn1*yTed^?{8Wa*v5 z2~NVI??c3WmfIh%alVkH2wJ3Bu~JTn76asjakvkUx; zIXoI9{%2<*PGrE|cRO@Vy8I21imQ8gliDj4(`okTf1Mjr=EZ{ECYzwY{2yrj6{6&B zIzDb^Qj90xJDAe2#6R2g)@CG}{Wpcs>(-+vT`lvy3^R3Nd(fYG zUWt|1HY}8JCCke}A$lS7^Y{$e{&@Sqt@kSYU!hco@vbR6M{$e2C7?_)ie{yXBiS_UMp~zPV8(+8`uQez zFUpyA?$0dQck=Q*baTp#}SxUltXQ2`@rbq~hGnqWU$2o!U+7 zsxzq`SX85`oTdg!k70$vEEkBb^X~G9GTo)ZmK1gH>A6WO&IhOvjmm%Ap}vW$a`|{9 zMqx$8g8K-m@RiKymv%Ls#5oBJHzIExQaM0EkuO<_gJmY+^xh&YCB_7M%z7+ms`maI z5U&_l_mR~uz4ib_X$dNcS#OZi%BAU z&JwT}8Nr(|_F!WXaxwl7RkV7UQQwh_q(|w=nvCNU-XL$c_93juf*? z-_ge_y=hP?^Gd+~@(AmvqI#-(y+HFXS^Y+tAb7WYT)OhWs9c9%i>RdEzq#>IM>>p=dx+au0 zdXl^6L~SbbDg~0CT&4@=^+p>fKJ;J<`csY3*2Z{=Nv4eJLY+i43ijXar_OjJ4>5ib zTVxzva3;gFj#)2X+;%}W|IaU>KKMCFm-<41yMWeY_;6-1f^jj;`dB^5>9EYdgg<<+wW$Z=Z2+};@$~!lN3)Hnr4p!z3qDa!9FUhMFNQMyN*uD3?L81PeZGu)x z@I7c9f%l)YUUx(zikIZ^UdxSYeRN>W;x-=-M~96ap8Z!&p<(7eF!M6CZOstv@ZB$$ zjoDOOGx(2yH`xwae}+rp6@J?b+S>=C z|4bef(0`CE#q&_wK@?%2>a?|v6m=FtNfAWN? ztBRVfajA!se69n}_)4jtLs8Z0&9!%bUr`OlS;8?PF)OYl{EeAGqJPjeUqw|)Vvf?h z4o_@sMk29*y`M-aLR1Jkj39YEO|pj!eqxdMU$lhS^9hyv|7i2(EmlHpc7m+r5@sF; Ns3>U4*U4IZ{eP3Yji&$r literal 0 HcmV?d00001 diff --git a/plinth/modules/nextcloud/static/icons/nextcloud.svg b/plinth/modules/nextcloud/static/icons/nextcloud.svg new file mode 100644 index 000000000..a04c5763b --- /dev/null +++ b/plinth/modules/nextcloud/static/icons/nextcloud.svg @@ -0,0 +1,55 @@ + + diff --git a/plinth/modules/nextcloud/urls.py b/plinth/modules/nextcloud/urls.py new file mode 100644 index 000000000..1132e071f --- /dev/null +++ b/plinth/modules/nextcloud/urls.py @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""URLs for the Nextcloud module.""" + +from django.urls import re_path + +from .views import NextcloudAppView + +urlpatterns = [ + re_path(r'^apps/nextcloud/$', NextcloudAppView.as_view(), name='index') +] diff --git a/plinth/modules/nextcloud/views.py b/plinth/modules/nextcloud/views.py new file mode 100644 index 000000000..aed885bce --- /dev/null +++ b/plinth/modules/nextcloud/views.py @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Django views for Nextcloud app.""" + +import logging + +from django.contrib import messages +from django.utils.translation import gettext_lazy as _ + +from plinth.modules.nextcloud.forms import NextcloudForm +from plinth.views import AppView + +from . import privileged + +logger = logging.getLogger(__name__) + + +class NextcloudAppView(AppView): + """Show Nextcloud app main view.""" + + app_id = 'nextcloud' + form_class = NextcloudForm + + def get_initial(self): + """Return the values to fill in the form.""" + initial = super().get_initial() + initial.update({'domain': privileged.get_domain()}) + return initial + + def form_valid(self, form): + """Apply the changes submitted in the form.""" + old_config = self.get_initial() + new_config = form.cleaned_data + + is_changed = False + + def _value_changed(key): + return old_config.get(key) != new_config.get(key) + + if _value_changed('domain'): + privileged.set_domain(new_config['domain']) + is_changed = True + + if new_config['admin_password']: + try: + privileged.set_admin_password(new_config['admin_password']) + is_changed = True + except Exception: + messages.error( + self.request, + _('Password update failed. Please choose a stronger ' + 'password.')) + if is_changed: + messages.success(self.request, _('Configuration updated.')) + + return super().form_valid(form) From 8ef680f45078e5c768770cb28b3ac3b490e62ea8 Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Thu, 5 Oct 2023 22:14:31 +0200 Subject: [PATCH 11/30] nextcloud: Add backup/restore Signed-off-by: Benedek Nagy [sunil: Simplify method signature and name for setting maint. mode] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/nextcloud/__init__.py | 19 ++++++ plinth/modules/nextcloud/manifest.py | 12 +++- plinth/modules/nextcloud/privileged.py | 93 +++++++++++++++++++++++--- 3 files changed, 114 insertions(+), 10 deletions(-) diff --git a/plinth/modules/nextcloud/__init__.py b/plinth/modules/nextcloud/__init__.py index c71e80c6b..0db1b8250 100644 --- a/plinth/modules/nextcloud/__init__.py +++ b/plinth/modules/nextcloud/__init__.py @@ -8,6 +8,7 @@ from plinth import frontpage, menu from plinth.config import DropinConfigs from plinth.daemon import Daemon, SharedDaemon from plinth.modules.apache.components import Webserver, diagnose_url +from plinth.modules.backups.components import BackupRestore from plinth.modules.firewall.components import (Firewall, FirewallLocalProtection) from plinth.package import Packages @@ -104,6 +105,10 @@ class NextcloudApp(app_module.App): daemon = SharedDaemon('shared-daemon-nextcloud-mysql', 'mysql') self.add(daemon) + backup_restore = NextcloudBackupRestore('backup-restore-nextcloud', + **manifest.backup) + self.add(backup_restore) + def setup(self, old_version): """Install and configure the app.""" super().setup(old_version) @@ -121,3 +126,17 @@ class NextcloudApp(app_module.App): results = super().diagnose() results.append(diagnose_url('docker.com')) return results + + +class NextcloudBackupRestore(BackupRestore): + """Component to backup/restore Nextcloud.""" + + def backup_pre(self, packet): + """Save database contents.""" + super().backup_pre(packet) + privileged.dump_database() + + def restore_post(self, packet): + """Restore database contents.""" + super().restore_post(packet) + privileged.restore_database() diff --git a/plinth/modules/nextcloud/manifest.py b/plinth/modules/nextcloud/manifest.py index 005bea377..3967ed444 100644 --- a/plinth/modules/nextcloud/manifest.py +++ b/plinth/modules/nextcloud/manifest.py @@ -46,4 +46,14 @@ clients = [{ }] }] -backup = {} +backup = { + 'data': { + 'directories': [ + '/var/lib/containers/storage/volumes/nextcloud-volume-fbx/' + ], + 'files': [ + '/var/lib/plinth/backups-data/nextcloud-database.sql', + '/etc/redis/redis.conf' + ] + } +} diff --git a/plinth/modules/nextcloud/privileged.py b/plinth/modules/nextcloud/privileged.py index ec8ae4a4e..e3188cfac 100644 --- a/plinth/modules/nextcloud/privileged.py +++ b/plinth/modules/nextcloud/privileged.py @@ -4,6 +4,7 @@ import os import pathlib import random +import re import string import subprocess import time @@ -32,6 +33,9 @@ NEXTCLOUD_CRON_SERVICE_FILE = pathlib.Path( NEXTCLOUD_CRON_TIMER_FILE = pathlib.Path( f'{SYSTEMD_LOCATION}nextcloud-cron-fbx.timer') +DB_BACKUP_FILE = pathlib.Path( + '/var/lib/plinth/backups-data/nextcloud-database.sql') + @privileged def setup(): @@ -146,11 +150,22 @@ def _create_database(db_password): _db_file_path = pathlib.Path('/var/lib/mysql/nextcloud_fbx') if _db_file_path.exists(): return - query = f'''CREATE USER '{DB_USER}'@'{CONTAINER_IP}' -IDENTIFIED BY'{db_password}'; -CREATE DATABASE {DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -GRANT ALL PRIVILEGES ON {DB_NAME}.* TO '{DB_USER}'@'{CONTAINER_IP}'; -FLUSH PRIVILEGES;''' + + query = f'''CREATE DATABASE {DB_NAME} CHARACTER SET utf8mb4 + COLLATE utf8mb4_general_ci; +''' + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=True) + _set_db_privileges(db_password) + + +def _set_db_privileges(db_password): + """Create user, set password and provide permissions on the database.""" + query = f'''GRANT ALL PRIVILEGES ON {DB_NAME}.* TO + '{DB_USER}'@'{CONTAINER_IP}' + IDENTIFIED BY'{db_password}'; +FLUSH PRIVILEGES; +''' subprocess.run(['mysql', '--user', 'root'], input=query.encode(), check=True) @@ -261,10 +276,11 @@ def _remove_db_socket(): def _drop_database(): """Drop the mysql database that was created during install.""" - query = f'''DROP DATABASE {DB_NAME}; -DROP User '{DB_USER}'@'{CONTAINER_IP}';''' - subprocess.run(['mysql', '--user', 'root'], input=query.encode(), - check=True) + with action_utils.service_ensure_running('mysql'): + query = f'''DROP DATABASE {DB_NAME}; + DROP User '{DB_USER}'@'{CONTAINER_IP}';''' + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=True) def _generate_secret_key(length=64, chars=None): @@ -272,3 +288,62 @@ def _generate_secret_key(length=64, chars=None): chars = chars or (string.ascii_letters + string.digits) rand = random.SystemRandom() return ''.join(rand.choice(chars) for _ in range(length)) + + +def _set_maintenance_mode(on: bool): + """Turn maintenance mode on or off.""" + _run_occ('maintenance:mode', '--on' if on else '--off') + + +@privileged +def dump_database(): + """Dump database to file.""" + _set_maintenance_mode(True) + DB_BACKUP_FILE.parent.mkdir(parents=True, exist_ok=True) + with action_utils.service_ensure_running('mysql'): + with DB_BACKUP_FILE.open('w', encoding='utf-8') as file_handle: + subprocess.run([ + 'mysqldump', '--add-drop-database', '--add-drop-table', + '--add-drop-trigger', '--single-transaction', + '--default-character-set=utf8mb4', '--user', 'root', + '--databases', DB_NAME + ], stdout=file_handle, check=True) + _set_maintenance_mode(False) + + +@privileged +def restore_database(): + """Restore database from file.""" + with action_utils.service_ensure_running('mysql'): + with DB_BACKUP_FILE.open('r', encoding='utf-8') as file_handle: + subprocess.run(['mysql', '--user', 'root'], stdin=file_handle, + check=True) + + _set_db_privileges(_get_dbpassword()) + + action_utils.service_restart('redis-server') + _set_maintenance_mode(False) + + # Attempts to update UUIDs of user and group entries. By default, + # the command attempts to update UUIDs that have been invalidated by + # a migration step. + _run_occ('ldap:update-uuid') + + # Update the systems data-fingerprint after a backup is restored + _run_occ('maintenance:data-fingerprint') + + +def _get_dbpassword(): + """Return the database password from config.php. + + OCC cannot run unless Nextcloud can already connect to the database. + """ + config_file = ('/var/lib/containers/storage/volumes/nextcloud-volume-fbx' + '/_data/config/config.php') + with open(config_file, 'r', encoding='utf-8') as config: + config_contents = config.read() + + pattern = r"'{}'\s*=>\s*'([^']*)'".format(re.escape('dbpassword')) + match = re.search(pattern, config_contents) + + return match.group(1) From b21af70510a76e76a8c467e6d6dbdff968eeffbe Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Mon, 16 Oct 2023 22:59:38 +0200 Subject: [PATCH 12/30] nextcloud: Add option to configure the default phone region This setting is necessarry to pass the setup warning under /nextcloud/settings/admin/overview Note: during testing the field only becomes visible once the freedombox-develop command is restarted https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html#default-phone-region Signed-off-by: Benedek Nagy [sunil: Add missing docstring] [sunil: Update form label for consistency] [sunil: Reduce number of success form messages] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/nextcloud/__init__.py | 3 ++- plinth/modules/nextcloud/forms.py | 17 +++++++++++++++++ plinth/modules/nextcloud/privileged.py | 18 ++++++++++++++++++ plinth/modules/nextcloud/views.py | 11 ++++++++++- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/plinth/modules/nextcloud/__init__.py b/plinth/modules/nextcloud/__init__.py index 0db1b8250..043d343e3 100644 --- a/plinth/modules/nextcloud/__init__.py +++ b/plinth/modules/nextcloud/__init__.py @@ -64,7 +64,8 @@ class NextcloudApp(app_module.App): self.add(shortcut) packages = Packages('packages-nextcloud', - ['podman', 'default-mysql-server'], + ['podman', 'default-mysql-server', + 'python3-iso3166'], conflicts=['libpam-tmpdir'], conflicts_action=Packages.ConflictsAction.REMOVE) self.add(packages) diff --git a/plinth/modules/nextcloud/forms.py b/plinth/modules/nextcloud/forms.py index d2c0dcb64..1d32ccaf3 100644 --- a/plinth/modules/nextcloud/forms.py +++ b/plinth/modules/nextcloud/forms.py @@ -5,6 +5,17 @@ from django import forms from django.utils.translation import gettext_lazy as _ +def _get_phone_regions(): + """Return choice field choices for phone regions.""" + try: + from iso3166 import countries # type: ignore + phone_regions = [(country.alpha2, country.name) + for country in countries] + return sorted(phone_regions) + except ImportError: + return [('US', 'United States of America')] + + class NextcloudForm(forms.Form): """Nextcloud configuration form.""" @@ -19,3 +30,9 @@ class NextcloudForm(forms.Form): 'and the minimum required length is 10 characters' '. Leave this field blank to keep the current password.'), required=False, widget=forms.PasswordInput, min_length=10) + + default_phone_region = forms.ChoiceField( + label=_('Default phone region'), required=False, + help_text=_('The default phone region is required to validate phone ' + 'numbers in the profile settings without a country code.'), + choices=_get_phone_regions) diff --git a/plinth/modules/nextcloud/privileged.py b/plinth/modules/nextcloud/privileged.py index e3188cfac..d0fe5f80e 100644 --- a/plinth/modules/nextcloud/privileged.py +++ b/plinth/modules/nextcloud/privileged.py @@ -126,6 +126,24 @@ def set_admin_password(password: str): ], check=True) +@privileged +def get_default_phone_region(): + """"Get the value of default_phone_region.""" + try: + default_phone_region = _run_occ('config:system:get', + 'default_phone_region', + capture_output=True) + return default_phone_region.stdout.decode().strip() + except subprocess.CalledProcessError: + return None + + +@privileged +def set_default_phone_region(region: str): + """"Set the value of default_phone_region.""" + _run_occ('config:system:set', 'default_phone_region', '--value', region) + + def _configure_firewall(action, interface_name): subprocess.run([ 'firewall-cmd', '--permanent', '--zone=trusted', diff --git a/plinth/modules/nextcloud/views.py b/plinth/modules/nextcloud/views.py index aed885bce..3eb01240d 100644 --- a/plinth/modules/nextcloud/views.py +++ b/plinth/modules/nextcloud/views.py @@ -23,7 +23,10 @@ class NextcloudAppView(AppView): def get_initial(self): """Return the values to fill in the form.""" initial = super().get_initial() - initial.update({'domain': privileged.get_domain()}) + initial.update({ + 'domain': privileged.get_domain(), + 'default_phone_region': privileged.get_default_phone_region() + }) return initial def form_valid(self, form): @@ -49,6 +52,12 @@ class NextcloudAppView(AppView): self.request, _('Password update failed. Please choose a stronger ' 'password.')) + + if _value_changed('default_phone_region'): + privileged.set_default_phone_region( + new_config['default_phone_region']) + is_changed = True + if is_changed: messages.success(self.request, _('Configuration updated.')) From 60f8a3f3db5a0d80de06d4158acc5aaab48dd222 Mon Sep 17 00:00:00 2001 From: Benedek Nagy Date: Mon, 23 Oct 2023 18:45:56 +0200 Subject: [PATCH 13/30] nextcloud: Configure redis caching, create static PHP file Configure caching for Nextcloud with Redis running on the host, create static php file under /var/lib/containers/storage/volumes/nextcloud-volume-fbx/_data/config. Nextcloud communicates with Redis via the bridge adapter, which isn't a loopback device. For this reason, setting a redis password is required. In addition, configure the email app to accomodate the changes. Signed-off-by: Benedek Nagy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/nextcloud/__init__.py | 8 ++-- plinth/modules/nextcloud/privileged.py | 65 ++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/plinth/modules/nextcloud/__init__.py b/plinth/modules/nextcloud/__init__.py index 043d343e3..b6960471e 100644 --- a/plinth/modules/nextcloud/__init__.py +++ b/plinth/modules/nextcloud/__init__.py @@ -63,10 +63,10 @@ class NextcloudApp(app_module.App): login_required=True) self.add(shortcut) - packages = Packages('packages-nextcloud', - ['podman', 'default-mysql-server', - 'python3-iso3166'], - conflicts=['libpam-tmpdir'], + packages = Packages('packages-nextcloud', [ + 'podman', 'default-mysql-server', 'python3-iso3166', + 'redis-server', 'php-redis' + ], conflicts=['libpam-tmpdir'], conflicts_action=Packages.ConflictsAction.REMOVE) self.add(packages) diff --git a/plinth/modules/nextcloud/privileged.py b/plinth/modules/nextcloud/privileged.py index d0fe5f80e..2fb3807f2 100644 --- a/plinth/modules/nextcloud/privileged.py +++ b/plinth/modules/nextcloud/privileged.py @@ -5,10 +5,13 @@ import os import pathlib import random import re +import shutil import string import subprocess import time +import augeas + from plinth import action_utils from plinth.actions import privileged @@ -36,6 +39,9 @@ NEXTCLOUD_CRON_TIMER_FILE = pathlib.Path( DB_BACKUP_FILE = pathlib.Path( '/var/lib/plinth/backups-data/nextcloud-database.sql') +REDIS_CONFIG = '/etc/redis/redis.conf' +REDIS_CONFIG_AUG = f'/files{REDIS_CONFIG}' + @privileged def setup(): @@ -65,6 +71,10 @@ def setup(): time.sleep(1) _nextcloud_setup_wizard(database_password, administrator_password) + _bind_redis(f'127.0.0.1 -::1 {BRIDGE_IP}') + _set_redis_password(_generate_secret_key(16)) + action_utils.service_restart('redis-server') + _create_redis_config(_get_redis_password()) # Check if LDAP has already been configured. This is necessary because # if the setup proccess is rerun when updating the FredomBox app another # redundant LDAP config would be created. @@ -275,6 +285,10 @@ WantedBy=timers.target @privileged def uninstall(): """Uninstall Nextcloud""" + # Set bind setting back to default in case other apps + # are still using it + _bind_redis('127.0.0.1 -::1') + action_utils.service_restart('redis-server') _drop_database() _remove_db_socket() _configure_firewall(action='remove', interface_name=NETWORK_NAME) @@ -365,3 +379,54 @@ def _get_dbpassword(): match = re.search(pattern, config_contents) return match.group(1) + + +def _create_redis_config(password): + """Create a php file for Redis configuration.""" + config_file = pathlib.Path( + '/var/lib/containers/storage/volumes/nextcloud-volume-fbx/_data/' + 'config/freedombox.config.php') + file_content = f''' true, +'memcache.locking' => '\\\\OC\\\\Memcache\\\\Redis', +'memcache.distributed' => '\\\\OC\\\\Memcache\\\\Redis', +'redis' => [ + 'host' => '{BRIDGE_IP}', + 'port' => '6379', + 'password' => '{password}', + ], +]; +''' + config_file.write_text(file_content) + shutil.chown(config_file, 'www-data', 'www-data') + + +def _load_augeas(): + """Initialize Augeas.""" + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) + aug.transform('Spacevars', REDIS_CONFIG) + aug.set('/augeas/context', REDIS_CONFIG_AUG) + aug.load() + return aug + + +def _bind_redis(ip_address): + """Configure Redis to listen on the podman bridge adapter.""" + aug = _load_augeas() + aug.set(REDIS_CONFIG_AUG + '/bind', ip_address) + aug.save() + + +def _set_redis_password(password): + if _get_redis_password() is None: + aug = _load_augeas() + aug.set(REDIS_CONFIG_AUG + '/requirepass', password) + aug.save() + + +def _get_redis_password() -> str: + aug = _load_augeas() + password = aug.get(REDIS_CONFIG_AUG + '/requirepass') + return password From 701f8e6dc92588ddcdd624b59378ec47575b16ae Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 29 Mar 2024 15:48:19 -0700 Subject: [PATCH 14/30] nextcloud: Diasble app until more testing and review changes Signed-off-by: Sunil Mohan Adapa --- .../data/usr/share/freedombox/modules-enabled/nextcloud | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud b/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud index 4a1247e87..50ee07ded 100644 --- a/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud +++ b/plinth/modules/nextcloud/data/usr/share/freedombox/modules-enabled/nextcloud @@ -1 +1 @@ -plinth.modules.nextcloud +#plinth.modules.nextcloud From 9366597b773daa2a761897c01e1ccf133938f11a Mon Sep 17 00:00:00 2001 From: ikmaak Date: Fri, 29 Mar 2024 18:00:25 +0000 Subject: [PATCH 15/30] Translated using Weblate (Dutch) Currently translated at 99.5% (1547 of 1554 strings) --- plinth/locale/nl/LC_MESSAGES/django.po | 47 ++++++++------------------ 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 6715750e6..895ff14cf 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-02-28 10:02+0000\n" +"PO-Revision-Date: 2024-03-30 16:18+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch \n" @@ -105,14 +105,12 @@ msgid "Use the language preference set in the browser" msgstr "Gebruik de taalvoorkeuren die zijn ingesteld in de browser" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "Openbare zichtbaarheid" +msgstr "Zichtbaarheid" #: menu.py:108 msgid "Data" -msgstr "" +msgstr "Data" #: menu.py:110 templates/base.html:131 msgid "System" @@ -124,10 +122,8 @@ msgid "Security" msgstr "Security" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Serverbeheer" +msgstr "Beheer" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -3396,10 +3392,9 @@ msgstr "" "duren voordat het effect heeft." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "Intrekken certificaat voor domein {domain} mislukt: {error}" +msgstr "Intrekken certificaat voor domein {domain} mislukt" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3407,10 +3402,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "Certificaat voor domein {domain} met succes verkregen" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "Verkrijgen van certificaat voor domein {domain} is mislukt: {error}" +msgstr "Verkrijgen van certificaat voor domein {domain} is mislukt" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3418,10 +3412,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "Certificaat met succes verwijderd voor domein {domain}" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "Verwijderen certificaat voor domein {domain} mislukt: {error}" +msgstr "Verwijderen certificaat voor domein {domain} mislukt" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6716,20 +6709,16 @@ msgid "Created snapshot." msgstr "Gemaakte snapshot." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Configuratie bijgewerkt." +msgstr "Configuratie bijwerking mislukt." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Verwijderde geselecteerde snapshots" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "Verwijderen van LDAP gebruiker mislukt." +msgstr "Verwijderen van snapshot mislukt." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -6971,10 +6960,8 @@ msgid "Read-only root filesystem" msgstr "Alleen-lezen bestandssysteem" #: modules/storage/__init__.py:392 -#, fuzzy -#| msgid "Go to Networks" msgid "Go to Power" -msgstr "Ga naar Netwerken" +msgstr "Ga naar Power" #: modules/storage/forms.py:63 msgid "Invalid directory name." @@ -7086,10 +7073,8 @@ msgid "Device can be safely unplugged." msgstr "Het apparaat kan veilig worden losgekoppeld." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Fout bij verwijderen van apparaat: {error_message}" +msgstr "Fout bij verwijderen van apparaat." #: modules/syncthing/__init__.py:23 msgid "" @@ -7701,10 +7686,8 @@ msgid "Test distribution upgrade now" msgstr "Test de distributie-upgrade nu" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" -msgstr "Fout bij het instellen van automatische upgrades: {error}" +msgstr "Fout bij het instellen van automatische upgrades" #: modules/upgrades/views.py:120 msgid "Upgrade process started." From b5c641097aef0e210aad5bdcb538a28497042b8c Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 12:39:21 -0700 Subject: [PATCH 16/30] zoph: Re-add a safety check when reading the setup state of the app - Similar check was removed in 6646512a0adab6943503ec47372502fb28805911 when it was that it was not needed. Tests: - Run functional tests for zoph. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/zoph/privileged.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plinth/modules/zoph/privileged.py b/plinth/modules/zoph/privileged.py index 2f5655c88..12c009606 100644 --- a/plinth/modules/zoph/privileged.py +++ b/plinth/modules/zoph/privileged.py @@ -104,9 +104,13 @@ def set_configuration(enable_osm: bool | None = None, @privileged def is_configured() -> bool | None: """Return whether zoph app is configured.""" - process = subprocess.run(['zoph', '--get-config', 'interface.user.remote'], - stdout=subprocess.PIPE, check=True) - return process.stdout.decode().strip() == 'true' + try: + process = subprocess.run( + ['zoph', '--get-config', 'interface.user.remote'], + stdout=subprocess.PIPE, check=True) + return process.stdout.decode().strip() == 'true' + except (FileNotFoundError, subprocess.CalledProcessError): + return None @privileged From 90df34df86ee9deaae1bb39020d11cbf69e7397d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 12:41:11 -0700 Subject: [PATCH 17/30] zoph: Include dbconfig configuration file in backup - This will ensure that dbconfig is every triggered and regenerates the configuration/setup, everything is consistent. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/zoph/manifest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plinth/modules/zoph/manifest.py b/plinth/modules/zoph/manifest.py index f9a5f52d7..a9a0564f3 100644 --- a/plinth/modules/zoph/manifest.py +++ b/plinth/modules/zoph/manifest.py @@ -16,6 +16,9 @@ backup = { 'directories': ['/var/lib/zoph/'] }, 'secrets': { - 'files': ['/etc/zoph.ini'], + 'files': [ + '/etc/zoph.ini', + '/etc/dbconfig-common/zoph.conf', + ], } } From a28dc369d31014c07a65dae022bd7629645f1ae6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 12:42:20 -0700 Subject: [PATCH 18/30] ttrss: Include dbconfig configuration file in backup - This will ensure that dbconfig is every triggered and regenerates the configuration/setup, everything is consistent. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/ttrss/manifest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plinth/modules/ttrss/manifest.py b/plinth/modules/ttrss/manifest.py index d6c6a2d5c..1bb59be5a 100644 --- a/plinth/modules/ttrss/manifest.py +++ b/plinth/modules/ttrss/manifest.py @@ -54,7 +54,10 @@ backup = { 'files': ['/var/lib/plinth/backups-data/ttrss-database.sql'] }, 'secrets': { - 'files': ['/etc/tt-rss/database.php'] + 'files': [ + '/etc/tt-rss/database.php', + '/etc/dbconfig-common/tt-rss.conf', + ] }, 'services': ['tt-rss'] } From f3b4c6f85e4f411a59131316567195f9c4f4037b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 12:42:36 -0700 Subject: [PATCH 19/30] ttrss: tests: functional: Uninstall during backup/restore test - This checks backup/restore step more accurately with new database user vs. old database user. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/ttrss/tests/test_functional.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index 8ca0d62ef..77349e3db 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -26,7 +26,7 @@ class TestTTRSSApp(functional.BaseAppTests): _subscribe(session_browser) functional.backup_create(session_browser, APP_ID, 'test_ttrss') - _unsubscribe(session_browser) + functional.uninstall(session_browser, self.app_name) functional.backup_restore(session_browser, APP_ID, 'test_ttrss') assert functional.service_is_running(session_browser, APP_ID) @@ -40,7 +40,16 @@ def _ttrss_load_main_interface(browser): functional.eventually(lambda: not overlay.visible) +def _expand_nodes(browser): + """If interface has category nodes collapsed, expand them.""" + nodes = browser.find_by_css('span.dijitTreeExpandoClosed') + for node in nodes: + node.click() + + def _is_feed_shown(browser, invert=False): + """Return whether the test feed is present.""" + _expand_nodes(browser) return browser.is_text_present('Planet Debian') != invert @@ -74,9 +83,7 @@ def _subscribe(browser): def _unsubscribe(browser): """Unsubscribe from a feed in TT-RSS.""" _ttrss_load_main_interface(browser) - expand = browser.find_by_css('span.dijitTreeExpandoClosed') - if expand: - expand.first.click() + _expand_nodes(browser) browser.find_by_text('Planet Debian').click() _click_main_menu_item(browser, 'Unsubscribe') From 7c5c9604004d521b32efbed1338d3a4414357a87 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 15:46:51 -0700 Subject: [PATCH 20/30] ttrss: Improve backup and restore of the database - Don't dump all the databases on the server. Instead dump only the ttrss database and its role. - Use database configuration instead of hardcoded database name 'ttrss'. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/ttrss/privileged.py | 65 ++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/plinth/modules/ttrss/privileged.py b/plinth/modules/ttrss/privileged.py index a59aaf3ca..4d2526826 100644 --- a/plinth/modules/ttrss/privileged.py +++ b/plinth/modules/ttrss/privileged.py @@ -83,25 +83,34 @@ def setup(): action_utils.service_restart('tt-rss') +def _get_database_config(): + """Return the database configuration.""" + aug = load_augeas() + + def _get_value(variable_name): + """Return the value of a variable from database configuration file.""" + return aug.get('/files' + DATABASE_FILE + '/$' + variable_name) \ + .strip("'\"") + + return { + 'user': _get_value('dbuser'), + 'password': _get_value('dbpass'), + 'database': _get_value('dbname'), + 'host': _get_value('dbserver') + } + + @privileged def enable_api_access(): """Enable API access so that tt-rss can be accessed through mobile app.""" import psycopg2 # Only available post installation - aug = load_augeas() + config = _get_database_config() - def get_value(variable_name): - """Return the value of a variable from database configuration file.""" - return aug.get('/files' + DATABASE_FILE + '/$' + variable_name) \ - .strip("'\"") - - user = get_value('dbuser') - password = get_value('dbpass') - database = get_value('dbname') - host = get_value('dbserver') - - connection = psycopg2.connect(database=database, user=user, - password=password, host=host) + connection = psycopg2.connect(database=config['database'], + user=config['user'], + password=config['password'], + host=config['host']) cursor = connection.cursor() cursor.execute("UPDATE ttrss_prefs SET def_value=true " @@ -114,27 +123,41 @@ def enable_api_access(): @privileged def dump_database(): """Dump database to file.""" + config = _get_database_config() os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: - # XXX: Currently, ttrss is the only app that uses - # PostgreSQL. If another app was using it, then its data would - # be included in the backup here. - _run_as_postgres(['pg_dumpall'], stdout=db_backup_file) + process = _run_as_postgres(['pg_dumpall', '--roles-only'], + stdout=subprocess.PIPE) + db_backup_file.write(f'DROP ROLE IF EXISTS {config["user"]};\n') + for line in process.stdout.decode().splitlines(): + if config['user'] in line: + db_backup_file.write(line + '\n') + + with open(DB_BACKUP_FILE, 'a', encoding='utf-8') as db_backup_file: + _run_as_postgres([ + 'pg_dump', '--create', '--clean', '--if-exists', config['database'] + ], stdout=db_backup_file) @privileged def restore_database(): """Restore database from file.""" - _run_as_postgres(['dropdb', 'ttrss']) - _run_as_postgres(['createdb', 'ttrss']) + config = _get_database_config() + + # This is needed for old backups only. New backups include 'DROP DATABASE + # IF EXISTS' and 'CREATE DATABASE' statements. + _run_as_postgres(['dropdb', config['database']]) + _run_as_postgres(['createdb', config['database']]) + with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: - _run_as_postgres(['psql', '--dbname', 'ttrss'], stdin=db_restore_file) + _run_as_postgres(['psql', '--dbname', config['database']], + stdin=db_restore_file) def _run_as_postgres(command, stdin=None, stdout=None): """Run a command as postgres user.""" command = ['sudo', '--user', 'postgres'] + command - subprocess.run(command, stdin=stdin, stdout=stdout, check=True) + return subprocess.run(command, stdin=stdin, stdout=stdout, check=True) def load_augeas(): From fdaba80de345af0d7db25ee6643ff7fe48b3f8bb Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Mar 2024 16:13:54 -0700 Subject: [PATCH 21/30] ttrss: Ensure that database is removed after uninstall - Setting ttrss/purge to 'true' in debconf is not retrained after the package has been install. So, set it again just before package removal. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/ttrss/__init__.py | 5 +++++ plinth/modules/ttrss/privileged.py | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index de9f53f3a..945f2bb6b 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -120,6 +120,11 @@ class TTRSSApp(app_module.App): if not old_version: self.enable() + def uninstall(self): + """De-configure and uninstall the app.""" + privileged.uninstall() + super().uninstall() + def force_upgrade(self, packages): """Force update package to resolve conffile prompts.""" if 'tt-rss' not in packages: diff --git a/plinth/modules/ttrss/privileged.py b/plinth/modules/ttrss/privileged.py index 4d2526826..5af79a56f 100644 --- a/plinth/modules/ttrss/privileged.py +++ b/plinth/modules/ttrss/privileged.py @@ -171,3 +171,11 @@ def load_augeas(): aug.set('/augeas/load/Phpvars/incl[last() + 1]', DATABASE_FILE) aug.load() return aug + + +@privileged +def uninstall(): + """Ensure that the database is removed.""" + # This setting set before deb package installation is not retrained, + # somehow. + action_utils.debconf_set_selections(['tt-rss tt-rss/purge boolean true']) From 2b16bdb5cd7536f57312d32866a22308223d64b7 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 31 Mar 2024 21:00:10 -0400 Subject: [PATCH 22/30] upgrades: Re-enable unattended-upgrade during dist-upgrade Previously, when dist-upgrading from bullseye to bookworm, there was an issue where unattended-upgrade gets stuck. See #2266. However, it does not get stuck when dist-upgrading from bookworm to trixie. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/upgrades/privileged.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plinth/modules/upgrades/privileged.py b/plinth/modules/upgrades/privileged.py index 8193d8154..53521de41 100644 --- a/plinth/modules/upgrades/privileged.py +++ b/plinth/modules/upgrades/privileged.py @@ -471,10 +471,12 @@ def _perform_dist_upgrade(): f'{DIST_UPGRADE_PRE_DEBCONF_SELECTIONS}', flush=True) debconf_set_selections(DIST_UPGRADE_PRE_DEBCONF_SELECTIONS) - # XXX: unattended-upgrade gets stuck here, see #2266. # This will upgrade most of the packages. - # print('Running unattended-upgrade...', flush=True) - # subprocess.run(['unattended-upgrade', '--verbose'], check=False) + # Previously, when dist-upgrading from bullseye to bookworm, there was + # an issue where unattended-upgrade gets stuck. See #2266. However, it + # does not get stuck when dist-upgrading from bookworm to trixie. + print('Running unattended-upgrade...', flush=True) + subprocess.run(['unattended-upgrade', '--verbose'], check=False) # Remove obsolete packages that may prevent other packages from # upgrading. From 7ffc5233c192136c508524db3e3240b750d01616 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 1 Apr 2024 17:42:47 +0000 Subject: [PATCH 23/30] Translated using Weblate (French) Currently translated at 100.0% (1554 of 1554 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 67 ++++++++------------------ 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 91363ae57..f757ebd26 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-03-28 01:01+0000\n" +"PO-Revision-Date: 2024-04-02 18:01+0000\n" "Last-Translator: John Doe \n" "Language-Team: French \n" @@ -104,10 +104,8 @@ msgid "Use the language preference set in the browser" msgstr "Utiliser la langue du navigateur" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "Visibilité publique" +msgstr "Visibilité" #: menu.py:108 msgid "Data" @@ -123,10 +121,8 @@ msgid "Security" msgstr "Sécurité" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Administration du serveur" +msgstr "Administration" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -1604,30 +1600,21 @@ msgid "Go to diagnostics results" msgstr "Aller aux résultats des diagnostics" #: modules/diagnostics/forms.py:11 -#, fuzzy -#| msgid "Enable Subdomains" msgid "Enable daily run" -msgstr "Activer les sous-domaines" +msgstr "Activer l'exécution quotidienne" #: modules/diagnostics/forms.py:12 -#, fuzzy -#| msgid "When enabled, FreedomBox automatically updates once a day." msgid "When enabled, diagnostic checks will run once a day." msgstr "" -"En activant cette option, la FreedomBox se mettra à jour automatiquement une " -"fois par jour." +"En activant cette option, les diagnostics s'exécuteront une fois par jour." #: modules/diagnostics/templates/diagnostics.html:11 -#, fuzzy -#| msgid "Diagnostics" msgid "Diagnostics Run" -msgstr "Diagnostics" +msgstr "Exécution des diagnostics" #: modules/diagnostics/templates/diagnostics.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Run Diagnostics Now" -msgstr "Lancer les diagnostics" +msgstr "Lancer les diagnostics maintenant" #: modules/diagnostics/templates/diagnostics.html:22 msgid "View Results" @@ -3472,11 +3459,9 @@ msgstr "" "nécessiter quelques instants avant de prendre effet." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "" -"La révocation du certificat pour le domaine {domain} a échoué : {error}" +msgstr "La révocation du certificat pour le domaine {domain} a échoué" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3484,10 +3469,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "Le certificat pour le domaine {domain} a été obtenu avec succès" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "L’obtention du certificat pour le domaine {domain} a échoué : {error}" +msgstr "L’obtention du certificat pour le domaine {domain} a échoué" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3495,11 +3479,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "Le certificat pour le domaine {domain} a été supprimé" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "" -"La suppression du certificat pour le domaine {domain} a échoué : {error}" +msgstr "La suppression du certificat pour le domaine {domain} a échoué" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6861,20 +6843,16 @@ msgid "Created snapshot." msgstr "Instantané créé." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Configuration mise à jour." +msgstr "Échec de la mise à jour de la configuration." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Supprimer les instantanés sélectionnés" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "La suppression de l’utilisateur LDAP a échoué." +msgstr "La suppression de l’instantané a échoué." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -7237,10 +7215,8 @@ msgid "Device can be safely unplugged." msgstr "Le périphérique peut être débranché en toute sécurité." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Erreur lors de l’éjection du périphérique : {error_message}" +msgstr "Erreur lors de l’éjection du périphérique." #: modules/syncthing/__init__.py:23 msgid "" @@ -7864,12 +7840,10 @@ msgid "Test distribution upgrade now" msgstr "Lancer le test de mise à niveau de la distribution" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" msgstr "" -"Erreur lors de la configuration du système de mise à jour automatique " -"« unattended-upgrades » : {error}" +"Erreur lors de la configuration du système de mise à jour automatique « " +"unattended-upgrades »" #: modules/upgrades/views.py:120 msgid "Upgrade process started." @@ -8685,10 +8659,9 @@ msgid "Finished: {name}" msgstr "Terminé : {name}" #: package.py:206 -#, fuzzy, python-brace-format -#| msgid "Package {expression} is not available for install" +#, python-brace-format msgid "Package {package_expression} is not available for install" -msgstr "Le paquet {expression} n’est pas disponible à l’installation" +msgstr "Le paquet {package_expression} n’est pas disponible à l’installation" #: package.py:226 #, python-brace-format From 6f0897e70242c3ceab4cd35a296f5ec9811939af Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 4 Apr 2024 10:52:36 -0400 Subject: [PATCH 24/30] diagnostics: Don't store list of app objects with results current_results['apps'] was not being used anywhere. Make are_results_available() check more specific, and to align with what is stored in the database. Tests: - Run full diagnostics and check the results. - Restart plinth, and check that the diagnostic results are loaded from the database. Helps: #2410 Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/diagnostics/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index ff771de82..13fed1628 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -104,7 +104,6 @@ def _run_on_all_enabled_modules(): with results_lock: current_results = { - 'apps': [], 'results': collections.OrderedDict(), 'progress_percentage': 0, 'exception': None, @@ -125,8 +124,6 @@ def _run_on_all_enabled_modules(): apps.append((app.app_id, app)) current_results['results'][app.app_id] = {'id': app.app_id} - current_results['apps'] = apps - for current_index, (app_id, app) in enumerate(apps): app_results = { 'diagnosis': [], @@ -330,7 +327,7 @@ def _run_diagnostics(): def are_results_available(): """Return whether diagnostic results are available.""" with results_lock: - results = current_results + results = current_results.get('results') if not results: results = kvstore.get_default('diagnostics_results', '{}') From 68b52295e70f818a89b1cc7364c2f7e232e0939e Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 31 Mar 2024 03:37:35 -0700 Subject: [PATCH 25/30] actions: Don't repeat action traceback in stderr It is already available separately and now printed nicely. In cases where the exception is caused outside of the action method, continue to print stderr. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/actions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plinth/actions.py b/plinth/actions.py index 3db73e26c..0e8f39098 100644 --- a/plinth/actions.py +++ b/plinth/actions.py @@ -331,7 +331,6 @@ def _privileged_call(module_name, action_name, arguments): return_values = func(*arguments['args'], **arguments['kwargs']) return_value = {'result': 'success', 'return': return_values} except Exception as exception: - logger.exception('Error executing action: %s', exception) return_value = { 'result': 'exception', 'exception': { From 3cb580464a783186f76d2835b6e56401c09f196a Mon Sep 17 00:00:00 2001 From: Johannes Keyser Date: Sun, 7 Apr 2024 06:57:50 +0000 Subject: [PATCH 26/30] Translated using Weblate (German) Currently translated at 100.0% (1554 of 1554 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 47 ++++++++++---------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index a516751cf..d4eb5e4b6 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: 2024-03-25 20:44-0400\n" -"PO-Revision-Date: 2024-02-22 14:02+0000\n" -"Last-Translator: Olaf Schaf \n" +"PO-Revision-Date: 2024-04-08 07:01+0000\n" +"Last-Translator: Johannes Keyser \n" "Language-Team: German \n" "Language: de\n" @@ -105,14 +105,12 @@ msgid "Use the language preference set in the browser" msgstr "Die im Browser festgelegte Sprache verwenden" #: menu.py:106 -#, fuzzy -#| msgid "Public Visibility" msgid "Visibility" -msgstr "Öffentliche Sichtbarkeit" +msgstr "Sichtbarkeit" #: menu.py:108 msgid "Data" -msgstr "" +msgstr "Daten" #: menu.py:110 templates/base.html:131 msgid "System" @@ -124,10 +122,8 @@ msgid "Security" msgstr "Sicherheit" #: menu.py:114 -#, fuzzy -#| msgid "Server Administration" msgid "Administration" -msgstr "Serververwaltung" +msgstr "Verwaltung" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -3448,10 +3444,9 @@ msgstr "" "Momente dauern, bis dies in Kraft tritt." #: modules/letsencrypt/views.py:46 -#, fuzzy, python-brace-format -#| msgid "Failed to revoke certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to revoke certificate for domain {domain}" -msgstr "Fehler beim Widerrufen des Zertifikats für Domain {domain}: {error}" +msgstr "Fehler beim Widerrufen des Zertifikats für Domain {domain}" #: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format @@ -3459,10 +3454,9 @@ msgid "Certificate successfully obtained for domain {domain}" msgstr "Zertifikat erfolgreich bezogen für Domain {domain}" #: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 -#, fuzzy, python-brace-format -#| msgid "Failed to obtain certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to obtain certificate for domain {domain}" -msgstr "Fehler beim Beziehen des Zertifikats für Domain {domain}: {error}" +msgstr "Fehler beim Beziehen des Zertifikats für Domain {domain}" #: modules/letsencrypt/views.py:95 #, python-brace-format @@ -3470,10 +3464,9 @@ msgid "Certificate successfully deleted for domain {domain}" msgstr "Zertifikat erfolgreich widerrufen für Domain {domain}" #: modules/letsencrypt/views.py:100 -#, fuzzy, python-brace-format -#| msgid "Failed to delete certificate for domain {domain}: {error}" +#, python-brace-format msgid "Failed to delete certificate for domain {domain}" -msgstr "Fehler beim Widerrufen des Zertifikats für Domain {domain}: {error}" +msgstr "Fehler beim Löschen des Zertifikats für Domain {domain}" #: modules/matrixsynapse/__init__.py:26 msgid "" @@ -6806,20 +6799,16 @@ msgid "Created snapshot." msgstr "Schnappschuss erstellt." #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Konfiguration aktualisiert." +msgstr "Aktualisierung der Konfiguration fehlgeschlagen." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Ausgewählte Schnappschüsse gelöscht" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "Löschen von LDAP-Benutzer fehlgeschlagen." +msgstr "Löschen von Schnappschuss fehlgeschlagen." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -7184,10 +7173,8 @@ msgid "Device can be safely unplugged." msgstr "Gerät kann sicher entfernt werden." #: modules/storage/views.py:93 -#, fuzzy -#| msgid "Error ejecting device: {error_message}" msgid "Error ejecting device." -msgstr "Fehler beim Auswerfen des Geräts: {error_message}" +msgstr "Fehler beim Auswerfen des Geräts." #: modules/syncthing/__init__.py:23 msgid "" @@ -7806,10 +7793,8 @@ msgid "Test distribution upgrade now" msgstr "Distributions-Upgrade jetzt testen" #: modules/upgrades/views.py:73 -#, fuzzy -#| msgid "Error when configuring unattended-upgrades: {error}" msgid "Error when configuring unattended-upgrades" -msgstr "Fehler beim Konfigurieren von automatischen Aktualisierungen: {error}" +msgstr "Fehler beim Konfigurieren von automatischen Aktualisierungen" #: modules/upgrades/views.py:120 msgid "Upgrade process started." @@ -7881,6 +7866,8 @@ msgstr "Benutzername wird bereits verwendet oder ist reserviert." msgid "" "Optional. Used to send emails to reset password and important notifications." msgstr "" +"Optional. Gebraucht zum Senden von E-Mails für Passwortrücksetzung und für " +"wichtige Benachrichtigungen." #: modules/users/forms.py:106 msgid "" From 2c56128d5b3b29254ae16cda84e64d513da23072 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 8 Apr 2024 20:48:00 -0400 Subject: [PATCH 27/30] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/ar_SA/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/be/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/bg/LC_MESSAGES/django.po | 116 +++++++++++++++--- plinth/locale/bn/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/cs/LC_MESSAGES/django.po | 118 +++++++++++++++--- plinth/locale/da/LC_MESSAGES/django.po | 107 ++++++++++++++--- plinth/locale/de/LC_MESSAGES/django.po | 121 ++++++++++++++++--- plinth/locale/django.pot | 101 +++++++++++++--- plinth/locale/el/LC_MESSAGES/django.po | 118 +++++++++++++++--- plinth/locale/es/LC_MESSAGES/django.po | 120 ++++++++++++++++--- plinth/locale/fa/LC_MESSAGES/django.po | 105 +++++++++++++--- plinth/locale/fake/LC_MESSAGES/django.po | 107 ++++++++++++++--- plinth/locale/fr/LC_MESSAGES/django.po | 125 +++++++++++++++++--- plinth/locale/gl/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/gu/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/hi/LC_MESSAGES/django.po | 114 +++++++++++++++--- plinth/locale/hu/LC_MESSAGES/django.po | 119 ++++++++++++++++--- plinth/locale/id/LC_MESSAGES/django.po | 107 ++++++++++++++--- plinth/locale/it/LC_MESSAGES/django.po | 111 ++++++++++++++--- plinth/locale/ja/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/kn/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/lt/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/lv/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/nb/LC_MESSAGES/django.po | 115 +++++++++++++++--- plinth/locale/nl/LC_MESSAGES/django.po | 118 +++++++++++++++--- plinth/locale/pl/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/pt/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/ru/LC_MESSAGES/django.po | 119 ++++++++++++++++--- plinth/locale/si/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/sl/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/sq/LC_MESSAGES/django.po | 121 ++++++++++++++++--- plinth/locale/sr/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/sv/LC_MESSAGES/django.po | 119 ++++++++++++++++--- plinth/locale/ta/LC_MESSAGES/django.po | 101 +++++++++++++--- plinth/locale/te/LC_MESSAGES/django.po | 117 +++++++++++++++--- plinth/locale/tr/LC_MESSAGES/django.po | 118 +++++++++++++++--- plinth/locale/uk/LC_MESSAGES/django.po | 118 +++++++++++++++--- plinth/locale/vi/LC_MESSAGES/django.po | 103 +++++++++++++--- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 105 +++++++++++++--- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 103 +++++++++++++--- 41 files changed, 3774 insertions(+), 699 deletions(-) diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index dbbc02b25..fce7e2aba 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-10-19 06:18+0000\n" "Last-Translator: Shaik \n" "Language-Team: Arabic 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 1b513e9e8..34a4b3adb 100644 --- a/plinth/locale/ar_SA/LC_MESSAGES/django.po +++ b/plinth/locale/ar_SA/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/be/LC_MESSAGES/django.po b/plinth/locale/be/LC_MESSAGES/django.po index 8fe9de458..10390b546 100644 --- a/plinth/locale/be/LC_MESSAGES/django.po +++ b/plinth/locale/be/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -843,10 +843,11 @@ msgid "Admin" msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 -#: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/snapshot/views.py:158 -#: modules/tor/views.py:73 modules/torproxy/views.py:71 -#: modules/upgrades/views.py:83 modules/zoph/views.py:74 +#: modules/nextcloud/views.py:62 modules/searx/views.py:35 +#: modules/searx/views.py:46 modules/security/views.py:56 +#: modules/snapshot/views.py:158 modules/tor/views.py:73 +#: modules/torproxy/views.py:71 modules/upgrades/views.py:83 +#: modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -1346,7 +1347,7 @@ msgid "" "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:237 msgid "Diagnostics" msgstr "" @@ -1368,49 +1369,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:206 +#: modules/diagnostics/__init__.py:203 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:211 +#: modules/diagnostics/__init__.py:208 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:218 +#: modules/diagnostics/__init__.py:215 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:223 +#: modules/diagnostics/__init__.py:220 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:235 +#: modules/diagnostics/__init__.py:232 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:237 +#: modules/diagnostics/__init__.py:234 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:268 +#: modules/diagnostics/__init__.py:265 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:311 +#: modules/diagnostics/__init__.py:308 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:312 +#: modules/diagnostics/__init__.py:309 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:317 +#: modules/diagnostics/__init__.py:314 msgid "Go to diagnostics results" msgstr "" @@ -1647,7 +1648,7 @@ msgstr "" #: modules/dynamicdns/templates/dynamicdns.html:18 #: modules/email/templates/email.html:35 #: modules/letsencrypt/templates/letsencrypt.html:24 -#: modules/mediawiki/forms.py:64 +#: modules/mediawiki/forms.py:64 modules/nextcloud/forms.py:23 msgid "Domain" msgstr "" @@ -4538,6 +4539,72 @@ msgstr "" msgid "Failed to delete connection: Connection not found." msgstr "" +#: modules/nextcloud/__init__.py:19 +msgid "" +"Nextcloud is a self-hosted productivity platform which provides private and " +"secure functions for file sharing, collaborative work, and more. Nextcloud " +"includes the Nextcloud server, client applications for desktop computers, " +"and mobile clients. The Nextcloud server provides a well integrated web " +"interface." +msgstr "" + +#: modules/nextcloud/__init__.py:24 +msgid "All users of FreedomBox can use Nextcloud." +msgstr "" + +#: modules/nextcloud/__init__.py:25 +msgid "To perform administrative actions, use the " +msgstr "" + +#: modules/nextcloud/__init__.py:27 +msgid "You can set a new password in the \"Configuration\" section below." +msgstr "" + +#: modules/nextcloud/__init__.py:28 +msgid "" +"Please note, that Nextcloud isn't maintained by Debian, which means security " +"and feature updates are applied independently." +msgstr "" + +#: modules/nextcloud/__init__.py:47 modules/nextcloud/manifest.py:11 +#: modules/nextcloud/manifest.py:18 +msgid "Nextcloud" +msgstr "" + +#: modules/nextcloud/__init__.py:49 +msgid "File Storage & Collaboration" +msgstr "" + +#: modules/nextcloud/forms.py:24 +msgid "Examples: \"myfreedombox.example.org\" or \"example.onion\"." +msgstr "" + +#: modules/nextcloud/forms.py:27 +msgid "Administrator password" +msgstr "" + +#: modules/nextcloud/forms.py:28 +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index de1315611..384ba18a1 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-09-18 19:00+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Задайте нова парола за администратора на MediaWiki (admin). Не избирайте " +"често срещана парола, минималната дължина е 10 знака . " +"Оставете полето празно, за да запазите текущата парола." + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Паролата не е променена. Изберете по-сложна парола" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 85ed77747..08884ae36 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index ac9d2cff2..dc051d249 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-11-20 05:11+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Nastavte nové heslo pro účet správce MediaWiki (admin). Heslo nemůže být " +"běžné a minimální požadovaná délka je 10 znaků. Chcete-li " +"zachovat aktuální heslo, ponechte toto pole prázdné." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Výchozí zóna je externí" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Aktualizace hesla se nezdařila. Zvolte prosím silnější heslo" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index bf353a2be..8b41f9b97 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default" +msgid "Default phone region" +msgstr "Standard" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index d4eb5e4b6..7b961edd9 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-04-08 07:01+0000\n" "Last-Translator: Johannes Keyser \n" "Language-Team: German 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Geben Sie ein neues Passwort für den MediaWiki-Administrator ein (admin). " +"Das Passwort darf nicht allgemein bekannt sein und muss mindestens " +"10 Zeichen lang sein. Lassen Sie das Feld leer, bleibt das " +"derzeitige Passwort bestehen." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Standard-Zone ist extern" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Kennwortaktualisierung fehlgeschlagen. Bitte wählen Sie ein stärkeres " +"Passwort" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 04c603603..bc2ebb77e 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -844,10 +844,11 @@ msgid "Admin" msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 -#: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/snapshot/views.py:158 -#: modules/tor/views.py:73 modules/torproxy/views.py:71 -#: modules/upgrades/views.py:83 modules/zoph/views.py:74 +#: modules/nextcloud/views.py:62 modules/searx/views.py:35 +#: modules/searx/views.py:46 modules/security/views.py:56 +#: modules/snapshot/views.py:158 modules/tor/views.py:73 +#: modules/torproxy/views.py:71 modules/upgrades/views.py:83 +#: modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -1347,7 +1348,7 @@ msgid "" "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:237 msgid "Diagnostics" msgstr "" @@ -1369,49 +1370,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:206 +#: modules/diagnostics/__init__.py:203 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:211 +#: modules/diagnostics/__init__.py:208 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:218 +#: modules/diagnostics/__init__.py:215 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:223 +#: modules/diagnostics/__init__.py:220 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:235 +#: modules/diagnostics/__init__.py:232 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:237 +#: modules/diagnostics/__init__.py:234 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:268 +#: modules/diagnostics/__init__.py:265 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:311 +#: modules/diagnostics/__init__.py:308 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:312 +#: modules/diagnostics/__init__.py:309 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:317 +#: modules/diagnostics/__init__.py:314 msgid "Go to diagnostics results" msgstr "" @@ -1648,7 +1649,7 @@ msgstr "" #: modules/dynamicdns/templates/dynamicdns.html:18 #: modules/email/templates/email.html:35 #: modules/letsencrypt/templates/letsencrypt.html:24 -#: modules/mediawiki/forms.py:64 +#: modules/mediawiki/forms.py:64 modules/nextcloud/forms.py:23 msgid "Domain" msgstr "" @@ -4539,6 +4540,72 @@ msgstr "" msgid "Failed to delete connection: Connection not found." msgstr "" +#: modules/nextcloud/__init__.py:19 +msgid "" +"Nextcloud is a self-hosted productivity platform which provides private and " +"secure functions for file sharing, collaborative work, and more. Nextcloud " +"includes the Nextcloud server, client applications for desktop computers, " +"and mobile clients. The Nextcloud server provides a well integrated web " +"interface." +msgstr "" + +#: modules/nextcloud/__init__.py:24 +msgid "All users of FreedomBox can use Nextcloud." +msgstr "" + +#: modules/nextcloud/__init__.py:25 +msgid "To perform administrative actions, use the " +msgstr "" + +#: modules/nextcloud/__init__.py:27 +msgid "You can set a new password in the \"Configuration\" section below." +msgstr "" + +#: modules/nextcloud/__init__.py:28 +msgid "" +"Please note, that Nextcloud isn't maintained by Debian, which means security " +"and feature updates are applied independently." +msgstr "" + +#: modules/nextcloud/__init__.py:47 modules/nextcloud/manifest.py:11 +#: modules/nextcloud/manifest.py:18 +msgid "Nextcloud" +msgstr "" + +#: modules/nextcloud/__init__.py:49 +msgid "File Storage & Collaboration" +msgstr "" + +#: modules/nextcloud/forms.py:24 +msgid "Examples: \"myfreedombox.example.org\" or \"example.onion\"." +msgstr "" + +#: modules/nextcloud/forms.py:27 +msgid "Administrator password" +msgstr "" + +#: modules/nextcloud/forms.py:28 +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 186ecc93e..6cce5cec5 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Ορίστε έναν νέο κωδικό πρόσβασης για το λογαριασμό διαχειριστή του (admin) " +"wiki. Αφήστε αυτό το πεδίο κενό για να διατηρήσετε τον τρέχοντα κωδικό " +"πρόσβασης." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default Skin" +msgid "Default phone region" +msgstr "Προεπιλεγμένη εμφάνιση" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password used to encrypt data. Must match server password." +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Κωδικός πρόσβασης που χρησιμοποιείται για την κρυπτογράφηση δεδομένων. " +"Πρέπει να ταιριάζει με τον κωδικό πρόσβασης του διακομιστή." + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 048fe94a3..08a633e80 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-28 01:01+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Definir una contraseña nueva para la cuenta de administración de MediaWiki " +"(admin). La contraseña no debe ser trivial y tiene que tener una longitud " +"mínima de 10 caracteres. Déjala en blanco para conservar la " +"contraseña actual." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "La zona por defecto es externa" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Falló la actualización de la contraseña. Use otra contraseña más fuerte" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 798e6cd96..ebcfdc5f2 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default" +msgid "Default phone region" +msgstr "پیش‌فرض" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index dc49c7a84..b86506e67 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default" +msgid "Default phone region" +msgstr "DEFAULT" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, fuzzy, python-brace-format #| msgid "" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index f757ebd26..c5a1cb4d4 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-04-02 18:01+0000\n" "Last-Translator: John Doe \n" "Language-Team: French 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Définir un nouveau mot de passe pour le compte d’administration de MediaWiki " +"(admin). Le mot de passe ne peut pas être courant et la taille minimale " +"requise est de 10 caractères. Laissez ce champ vide pour " +"conserver le mot de passe actuel." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "La zone par défaut est externe" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Échec de la mise à jour du mot passe. Veuillez choisir un mot de passe plus " +"sûr" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" @@ -7842,8 +7929,8 @@ msgstr "Lancer le test de mise à niveau de la distribution" #: modules/upgrades/views.py:73 msgid "Error when configuring unattended-upgrades" msgstr "" -"Erreur lors de la configuration du système de mise à jour automatique « " -"unattended-upgrades »" +"Erreur lors de la configuration du système de mise à jour automatique " +"« unattended-upgrades »" #: modules/upgrades/views.py:120 msgid "Upgrade process started." diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 302bf202f..cf872dfea 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index eca8617fc..fa43a1fd8 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index b4fe27221..e2c86507e 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-10-19 06:30+0000\n" "Last-Translator: Shaik \n" "Language-Team: Hindi 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"मीडियाविकी एेडमिन अकाउंट के लिये नया पासवर्ड सेट करें (एेडमिन). वर्तमान पासवर्ड रखने के " +"लिए इस फ़ील्ड को रिक्त छोड़ें." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default app set" +msgid "Default phone region" +msgstr "डिफ़ॉल्ट एेप सेट" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password used to encrypt data. Must match server password." +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"डेटा एंक्रिप्ट करने के लिए पासवर्ड उपयोग किया गया . सर्वर पासवर्ड से मेल खाना चाहिए." + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index cd6b6ac2a..53588f18d 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-10-24 18:39+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Hungarian 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Új jelszó beállítása a MediaWiki 'admin' nevű felhasználója számára. A " +"jelszó nem lehet gyakran használt kifejezés, továbbá legalább 10 " +"karakterből kell állnia. Hagyd üresen ezt a mezőt, ha meg szeretnéd " +"tartani a jelenlegi jelszót." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default app set" +msgid "Default phone region" +msgstr "Alapértelmezett alkalmazás beállítva" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "A jlszó frisítése nem sikerült. Kérlek válassz egy erősebb jelszót" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 45f996684..07c4d6113 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password used to encrypt data. Must match server password." +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Kata sandi yang digunakan untuk mengenkripsi data. Harus mencocokkan kata " +"sandi server." + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index b1a882b58..dc7b5ef4c 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Italian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Imposta una nuova password per il profilo amministratore (admin) di " +"MediaWiki. Lascia vuoto questo campo per mantenere la password corrente." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default" +msgid "Default phone region" +msgstr "Default" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 1d43f9e96..52ff18cb6 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-05-07 23:50+0000\n" "Last-Translator: Nobuhiro Iwamatsu \n" "Language-Team: Japanese 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index 8e3f41813..964b3a9f7 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index 3de7841ca..26baf8584 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index 28042f231..a7142e2d8 100644 --- a/plinth/locale/lv/LC_MESSAGES/django.po +++ b/plinth/locale/lv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index dc9e9384c..eff3fe87d 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-28 01:01+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Sett et nytt passord for MediaWikis administratorkonto (admin). La dette " +"feltet stå tomt for å beholde gjeldende passord." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default app set" +msgid "Default phone region" +msgstr "Forvalgsprogram satt" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Passordoppdatering feilet. Vennligst bruk ett sterkere passord" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 895ff14cf..d6d55e84e 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-30 16:18+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Stel een nieuw wachtwoord in voor MediaWiki's beheerdersaccount (admin). Dit " +"wachtwoord moet minimaal 10 tekens zijn, en niet makkelijk " +"te raden. Laat dit veld leeg om het huidige wachtwoord te behouden." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Standaardzone is extern" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Wachtwoordupdate mislukt. Kies een sterker wachtwoord" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 449b81637..3fbfaa9b7 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Polish 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 9664704cc..a5442d139 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2023-05-22 15:50+0000\n" "Last-Translator: Frederico Gomes \n" "Language-Team: Portuguese 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 48524c361..1ba881b68 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-10-10 18:05+0000\n" "Last-Translator: Nikita Epifanov \n" "Language-Team: Russian 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Установить новый пароль для учетной записи администратора MediaWiki (admin). " +"Пароль не может быть общим, а минимальная требуемая длина составляет " +"10 символов. Оставьте это поле пустым, чтобы сохранить " +"текущий пароль." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default app set" +msgid "Default phone region" +msgstr "Приложение по умолчанию настроено" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Не удалось обновить пароль. Пожалуйста, выберите более надежный пароль" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index a8ca55cfa..6fbdc5229 100644 --- a/plinth/locale/si/LC_MESSAGES/django.po +++ b/plinth/locale/si/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index 59bb58977..30d7cd9b5 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 5cafd98d2..c6523e10f 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Caktoni një fjalëkalim të ri për llogarinë e përgjegjësit të MediaWiki-it " +"(admin). Fjalëkalimi s’mund të jetë i rëndomtë dhe gjatësia më e pakët e " +"domosdoshme është 10 shenja. Që të mbani fjalëkalimin e " +"tanishëm, lëreni të zbrazët këtë fushë." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Zona parazgjedhje është e jashtme" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "" +"Përditësimi i fjalëkalimit dështoi. Ju lutemi, zgjidhni një fjalëkalim më të " +"fortë" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index e4a1fd39d..fa4e15fbe 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 74978f802..74e0d9a30 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-02-02 20:01+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Ange ett nytt lösenord för MediaWiki's administratörskonto (admin). " +"Lösenordet kan inte vara vanligt och den minsta längden är 10 " +"tecken. Lämna det här fältet tomt om du vill behålla det nuvarande " +"lösenordet." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Standardzonen är extern" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Lösenordsuppdateringen misslyckades. Välj ett starkare lösenord" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index a96b5cc08..0f71124a2 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -845,10 +845,11 @@ msgid "Admin" msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 -#: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/snapshot/views.py:158 -#: modules/tor/views.py:73 modules/torproxy/views.py:71 -#: modules/upgrades/views.py:83 modules/zoph/views.py:74 +#: modules/nextcloud/views.py:62 modules/searx/views.py:35 +#: modules/searx/views.py:46 modules/security/views.py:56 +#: modules/snapshot/views.py:158 modules/tor/views.py:73 +#: modules/torproxy/views.py:71 modules/upgrades/views.py:83 +#: modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -1348,7 +1349,7 @@ msgid "" "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:237 msgid "Diagnostics" msgstr "" @@ -1370,49 +1371,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:206 +#: modules/diagnostics/__init__.py:203 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:211 +#: modules/diagnostics/__init__.py:208 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:218 +#: modules/diagnostics/__init__.py:215 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:223 +#: modules/diagnostics/__init__.py:220 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:235 +#: modules/diagnostics/__init__.py:232 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:237 +#: modules/diagnostics/__init__.py:234 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:268 +#: modules/diagnostics/__init__.py:265 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:311 +#: modules/diagnostics/__init__.py:308 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:312 +#: modules/diagnostics/__init__.py:309 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:317 +#: modules/diagnostics/__init__.py:314 msgid "Go to diagnostics results" msgstr "" @@ -1649,7 +1650,7 @@ msgstr "" #: modules/dynamicdns/templates/dynamicdns.html:18 #: modules/email/templates/email.html:35 #: modules/letsencrypt/templates/letsencrypt.html:24 -#: modules/mediawiki/forms.py:64 +#: modules/mediawiki/forms.py:64 modules/nextcloud/forms.py:23 msgid "Domain" msgstr "" @@ -4540,6 +4541,72 @@ msgstr "" msgid "Failed to delete connection: Connection not found." msgstr "" +#: modules/nextcloud/__init__.py:19 +msgid "" +"Nextcloud is a self-hosted productivity platform which provides private and " +"secure functions for file sharing, collaborative work, and more. Nextcloud " +"includes the Nextcloud server, client applications for desktop computers, " +"and mobile clients. The Nextcloud server provides a well integrated web " +"interface." +msgstr "" + +#: modules/nextcloud/__init__.py:24 +msgid "All users of FreedomBox can use Nextcloud." +msgstr "" + +#: modules/nextcloud/__init__.py:25 +msgid "To perform administrative actions, use the " +msgstr "" + +#: modules/nextcloud/__init__.py:27 +msgid "You can set a new password in the \"Configuration\" section below." +msgstr "" + +#: modules/nextcloud/__init__.py:28 +msgid "" +"Please note, that Nextcloud isn't maintained by Debian, which means security " +"and feature updates are applied independently." +msgstr "" + +#: modules/nextcloud/__init__.py:47 modules/nextcloud/manifest.py:11 +#: modules/nextcloud/manifest.py:18 +msgid "Nextcloud" +msgstr "" + +#: modules/nextcloud/__init__.py:49 +msgid "File Storage & Collaboration" +msgstr "" + +#: modules/nextcloud/forms.py:24 +msgid "Examples: \"myfreedombox.example.org\" or \"example.onion\"." +msgstr "" + +#: modules/nextcloud/forms.py:27 +msgid "Administrator password" +msgstr "" + +#: modules/nextcloud/forms.py:28 +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 0444f6f63..e2d90eb7e 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-02-11 20:14+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Telugu 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"మీడియావికీ యొక్క అడ్మినిస్ట్రేటర్ ఖాతా (admin) కోసం ఒక కొత్త పాస్వర్డ్ని సెట్ చెయ్యండి. ప్రస్తుత పాస్వర్డ్ని " +"ఉంచాలనుకుంటే ఈ ప్రదేశాన్ని ఖాళీగా వదిలేయండి." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "డిఫాల్ట్ జోన్ ఐస్ ఎక్స్టర్నల్" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "సమాచారాన్ని గుప్తీకరించాడానికి ఉపయోగించబడిన పాస్వర్డ్. తప్పకుండ సర్వర్ పాస్వర్డ్ తో సరిపోవాలి" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 6f5140979..b700925f4 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"MediaWiki'nin yönetici hesabı (admin) için yeni bir parola ayarlayın. Parola " +"ortak bir parola olamaz ve gereken en az uzunluk 10 karakterdir. Şu anki parolayı korumak için bu alanı boş bırakın." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Varsayılan bölge haricidir" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Parola güncelleme başarısız oldu. Lütfen daha güçlü bir parola seçin" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 9c228f43e..8e1f00803 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-02-05 00:01+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian 10 characters. Leave this field blank to keep the " +#| "current password." +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" +"Вкажіть новий пароль для облікового запису адміністратора (admin) MediaWiki. " +"Пароль не повинен бути поширеним і не повинен бути коротшим за 10 " +"знаків. Залиште поле порожнім, щоб зберегти поточний пароль." + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "Усталена зона – зовнішня" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +#, fuzzy +#| msgid "Password update failed. Please choose a stronger password" +msgid "Password update failed. Please choose a stronger password." +msgstr "Не вдалося оновити пароль. Оберіть сильніший пароль" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index c03cb419b..611305beb 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index ba6a04532..8dee394af 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2024-03-26 11:03+0000\n" "Last-Translator: 大王叫我来巡山 \n" @@ -880,10 +880,11 @@ msgid "Admin" msgstr "管理员" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 -#: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/snapshot/views.py:158 -#: modules/tor/views.py:73 modules/torproxy/views.py:71 -#: modules/upgrades/views.py:83 modules/zoph/views.py:74 +#: modules/nextcloud/views.py:62 modules/searx/views.py:35 +#: modules/searx/views.py:46 modules/security/views.py:56 +#: modules/snapshot/views.py:158 modules/tor/views.py:73 +#: modules/torproxy/views.py:71 modules/upgrades/views.py:83 +#: modules/zoph/views.py:74 msgid "Configuration updated." msgstr "配置已更新。" @@ -1417,7 +1418,7 @@ msgid "" msgstr "" "系统诊断将运行测试程序检查您的系统以确认应用程序和服务正在按预期方式运行。" -#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:237 msgid "Diagnostics" msgstr "诊断程序" @@ -1439,25 +1440,25 @@ msgstr "警告" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:206 +#: modules/diagnostics/__init__.py:203 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:211 +#: modules/diagnostics/__init__.py:208 msgid "GiB" msgstr "GiB" -#: modules/diagnostics/__init__.py:218 +#: modules/diagnostics/__init__.py:215 msgid "You should disable some apps to reduce memory usage." msgstr "你应该禁用一些应用程序以减少内存的使用。" -#: modules/diagnostics/__init__.py:223 +#: modules/diagnostics/__init__.py:220 msgid "You should not install any new apps on this system." msgstr "你不应该在这个系统上安装任何新的应用程序。" -#: modules/diagnostics/__init__.py:235 +#: modules/diagnostics/__init__.py:232 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1466,24 +1467,24 @@ msgstr "" "系统内存不足:已使用 {percent_used},{memory_available} " "{memory_available_unit}可用。{advice_message}" -#: modules/diagnostics/__init__.py:237 +#: modules/diagnostics/__init__.py:234 msgid "Low Memory" msgstr "低内存" -#: modules/diagnostics/__init__.py:268 +#: modules/diagnostics/__init__.py:265 msgid "Running diagnostics" msgstr "运行诊断程序" -#: modules/diagnostics/__init__.py:311 +#: modules/diagnostics/__init__.py:308 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:312 +#: modules/diagnostics/__init__.py:309 msgid "Diagnostics results" msgstr "诊断结果" -#: modules/diagnostics/__init__.py:317 +#: modules/diagnostics/__init__.py:314 msgid "Go to diagnostics results" msgstr "转到诊断结果" @@ -1743,7 +1744,7 @@ msgstr "状态" #: modules/dynamicdns/templates/dynamicdns.html:18 #: modules/email/templates/email.html:35 #: modules/letsencrypt/templates/letsencrypt.html:24 -#: modules/mediawiki/forms.py:64 +#: modules/mediawiki/forms.py:64 modules/nextcloud/forms.py:23 msgid "Domain" msgstr "域名" @@ -4716,6 +4717,76 @@ msgstr "连接 {name} 已删除。" msgid "Failed to delete connection: Connection not found." msgstr "删除连接失败: 找不到连接。" +#: modules/nextcloud/__init__.py:19 +msgid "" +"Nextcloud is a self-hosted productivity platform which provides private and " +"secure functions for file sharing, collaborative work, and more. Nextcloud " +"includes the Nextcloud server, client applications for desktop computers, " +"and mobile clients. The Nextcloud server provides a well integrated web " +"interface." +msgstr "" + +#: modules/nextcloud/__init__.py:24 +msgid "All users of FreedomBox can use Nextcloud." +msgstr "" + +#: modules/nextcloud/__init__.py:25 +msgid "To perform administrative actions, use the " +msgstr "" + +#: modules/nextcloud/__init__.py:27 +msgid "You can set a new password in the \"Configuration\" section below." +msgstr "" + +#: modules/nextcloud/__init__.py:28 +msgid "" +"Please note, that Nextcloud isn't maintained by Debian, which means security " +"and feature updates are applied independently." +msgstr "" + +#: modules/nextcloud/__init__.py:47 modules/nextcloud/manifest.py:11 +#: modules/nextcloud/manifest.py:18 +msgid "Nextcloud" +msgstr "" + +#: modules/nextcloud/__init__.py:49 +msgid "File Storage & Collaboration" +msgstr "" + +#: modules/nextcloud/forms.py:24 +msgid "Examples: \"myfreedombox.example.org\" or \"example.onion\"." +msgstr "" + +#: modules/nextcloud/forms.py:27 +#, fuzzy +#| msgid "Administrator Password" +msgid "Administrator password" +msgstr "管理员密码" + +#: modules/nextcloud/forms.py:28 +msgid "" +"Optional. Set a new password for Nextcloud's administrator account " +"(nextcloud-admin). The password cannot be a common one and the minimum " +"required length is 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +#, fuzzy +#| msgid "Default zone is external" +msgid "Default phone region" +msgstr "默认区域是外部的" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index ea533e548..eba202b8a 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: 2024-03-25 20:44-0400\n" +"POT-Creation-Date: 2024-04-08 20:47-0400\n" "PO-Revision-Date: 2021-12-23 12:50+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional) 10 characters. Leave this field blank to " +"keep the current password." +msgstr "" + +#: modules/nextcloud/forms.py:35 +msgid "Default phone region" +msgstr "" + +#: modules/nextcloud/forms.py:36 +msgid "" +"The default phone region is required to validate phone numbers in the " +"profile settings without a country code." +msgstr "" + +#: modules/nextcloud/views.py:53 +msgid "Password update failed. Please choose a stronger password." +msgstr "" + #: modules/openvpn/__init__.py:20 #, python-brace-format msgid "" From ff403c8af6a686d51a860768062d27d448742eb3 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 8 Apr 2024 21:49:00 -0400 Subject: [PATCH 28/30] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/Apache_userdir.raw.wiki | 8 ++- doc/manual/en/Calibre.raw.wiki | 3 +- doc/manual/en/Coturn.raw.wiki | 1 + doc/manual/en/Deluge.raw.wiki | 8 +-- doc/manual/en/Email.raw.wiki | 20 ++++++-- doc/manual/en/Infinoted.raw.wiki | 4 +- doc/manual/en/JSXC.raw.wiki | 1 + doc/manual/en/MatrixSynapse.raw.wiki | 5 +- doc/manual/en/MediaWiki.raw.wiki | 4 +- doc/manual/en/Minetest.raw.wiki | 1 + doc/manual/en/MiniDLNA.raw.wiki | 5 +- doc/manual/en/Mumble.raw.wiki | 2 +- doc/manual/en/OpenVPN.raw.wiki | 2 + doc/manual/en/Quassel.raw.wiki | 2 +- doc/manual/en/RSSBridge.raw.wiki | 2 +- doc/manual/en/Radicale.raw.wiki | 4 +- doc/manual/en/RaspberryPi3B+.raw.wiki | 4 +- doc/manual/en/RaspberryPi3B.raw.wiki | 4 +- doc/manual/en/RaspberryPi4B.raw.wiki | 4 +- doc/manual/en/ReleaseNotes.raw.wiki | 26 ++++++++++ doc/manual/en/Roundcube.raw.wiki | 3 +- doc/manual/en/Samba.raw.wiki | 3 +- doc/manual/en/Searx.raw.wiki | 3 +- doc/manual/en/SecureShell.raw.wiki | 73 ++++++++++++++++++++++++++- doc/manual/en/Shaarli.raw.wiki | 3 +- doc/manual/en/Shadowsocks.raw.wiki | 3 +- doc/manual/en/Sharing.raw.wiki | 6 +++ doc/manual/en/TinyTinyRSS.raw.wiki | 1 + doc/manual/en/Tor.raw.wiki | 2 +- doc/manual/en/Transmission.raw.wiki | 12 ++--- doc/manual/en/WireGuard.raw.wiki | 4 +- doc/manual/en/WordPress.raw.wiki | 10 ++-- doc/manual/en/Zoph.raw.wiki | 2 +- doc/manual/en/bepasty.raw.wiki | 2 +- doc/manual/en/ejabberd.raw.wiki | 20 +++----- doc/manual/es/Apache_userdir.raw.wiki | 7 ++- doc/manual/es/Calibre.raw.wiki | 1 + doc/manual/es/Coturn.raw.wiki | 1 + doc/manual/es/Deluge.raw.wiki | 1 + doc/manual/es/Email.raw.wiki | 10 ++++ doc/manual/es/Infinoted.raw.wiki | 3 +- doc/manual/es/JSXC.raw.wiki | 1 + doc/manual/es/MatrixSynapse.raw.wiki | 6 +-- doc/manual/es/MediaWiki.raw.wiki | 3 +- doc/manual/es/Minetest.raw.wiki | 1 + doc/manual/es/MiniDLNA.raw.wiki | 5 +- doc/manual/es/OpenVPN.raw.wiki | 4 +- doc/manual/es/Radicale.raw.wiki | 2 + doc/manual/es/RaspberryPi3B+.raw.wiki | 4 +- doc/manual/es/RaspberryPi3B.raw.wiki | 4 +- doc/manual/es/RaspberryPi4B.raw.wiki | 4 +- doc/manual/es/ReleaseNotes.raw.wiki | 26 ++++++++++ doc/manual/es/Roundcube.raw.wiki | 1 + doc/manual/es/Samba.raw.wiki | 1 + doc/manual/es/Searx.raw.wiki | 3 +- doc/manual/es/SecureShell.raw.wiki | 64 +++++++++++++++++++++-- doc/manual/es/Shaarli.raw.wiki | 1 + doc/manual/es/Shadowsocks.raw.wiki | 1 + doc/manual/es/Sharing.raw.wiki | 5 ++ doc/manual/es/TinyTinyRSS.raw.wiki | 1 + doc/manual/es/Tor.raw.wiki | 3 +- doc/manual/es/WireGuard.raw.wiki | 2 + doc/manual/es/WordPress.raw.wiki | 8 +-- doc/manual/es/ejabberd.raw.wiki | 13 ++--- 64 files changed, 350 insertions(+), 93 deletions(-) diff --git a/doc/manual/en/Apache_userdir.raw.wiki b/doc/manual/en/Apache_userdir.raw.wiki index 10b2c8877..06b380ae7 100644 --- a/doc/manual/en/Apache_userdir.raw.wiki +++ b/doc/manual/en/Apache_userdir.raw.wiki @@ -120,8 +120,12 @@ Learn more about ssh, scp and sftp with `$ man ssh`, `$ man scp` and `$ man sftp === External Links === - * Upstream project website: https://httpd.apache.org/docs/2.4/mod/mod_userdir.html - * User documentation: https://httpd.apache.org/docs/2.4/howto/public_html.html + + * Upstream Project: https://httpd.apache.org/ + * Debian Apache Wiki: https://wiki.debian.org/Apache + * User Documentation: + * https://httpd.apache.org/docs/2.4/mod/mod_userdir.html + * https://httpd.apache.org/docs/2.4/howto/public_html.html ## END_INCLUDE diff --git a/doc/manual/en/Calibre.raw.wiki b/doc/manual/en/Calibre.raw.wiki index 567c3b0bf..7f0bb6c82 100644 --- a/doc/manual/en/Calibre.raw.wiki +++ b/doc/manual/en/Calibre.raw.wiki @@ -32,7 +32,8 @@ calibre can be accessed after installation through the web client at {{{https:// === External links === - * Official website: https://calibre-ebook.com + * Upstream project: https://calibre-ebook.com + * Upstream end user documentation: https://calibre-ebook.com/help ## END_INCLUDE diff --git a/doc/manual/en/Coturn.raw.wiki b/doc/manual/en/Coturn.raw.wiki index adf74018f..78e3e8b79 100644 --- a/doc/manual/en/Coturn.raw.wiki +++ b/doc/manual/en/Coturn.raw.wiki @@ -53,6 +53,7 @@ If your !FreedomBox is behind a router, you will need to set up port forwarding === External links === * Upstream project: https://github.com/coturn/coturn + * Upstream end user documentation: https://github.com/coturn/coturn/wiki/ ## END_INCLUDE diff --git a/doc/manual/en/Deluge.raw.wiki b/doc/manual/en/Deluge.raw.wiki index 481ddb4c3..24523080e 100644 --- a/doc/manual/en/Deluge.raw.wiki +++ b/doc/manual/en/Deluge.raw.wiki @@ -50,12 +50,8 @@ At this point, you are ready to begin using Deluge. You can make further changes === External links === - * Upstream projects: - * Deluge: https://www.deluge-torrent.org - * !BitTorrent: https://www.bittorrent.org - * Protocol description: - * Upstream: https://www.bittorrent.org/introduction.html - * At Wikipedia: https://en.wikipedia.org/wiki/BitTorrent + * Upstream project: https://www.deluge-torrent.org + * Upstream end user documentation: https://dev.deluge-torrent.org/wiki/UserGuide ## END_INCLUDE diff --git a/doc/manual/en/Email.raw.wiki b/doc/manual/en/Email.raw.wiki index d645dd15d..d835c6eba 100644 --- a/doc/manual/en/Email.raw.wiki +++ b/doc/manual/en/Email.raw.wiki @@ -2,7 +2,7 @@ #language en ##TAG:TRANSLATION-HEADER-START -~- [[FreedomBox/Manual/Email|English]] - [[es/FreedomBox/Manual/Email|Spanish]] - [[uk/FreedomBox/Manual/Email|Українська]] - [[DebianWiki/EditorGuide#translation|(+)]] -~ +~- [[FreedomBox/Manual/Email|English]] - [[es/FreedomBox/Manual/Email|Español]] - [[uk/FreedomBox/Manual/Email|Українська]] - [[DebianWiki/EditorGuide#translation|(+)]] -~ ##TAG:TRANSLATION-HEADER-END <> @@ -207,12 +207,22 @@ Please provide your feedback on usage on [[https://discuss.freedombox.org/t/emai [[https://salsa.debian.org/freedombox-team/freedombox/-/merge_requests/2077|This salsa issue]] is driving the implementation. Feel free to join discussions and provide technical ideas. + === External links === - * Upstream websites: - * http://www.postfix.org - * https://www.dovecot.org - * https://www.rspamd.com + * Upstream projects: + * https://www.dovecot.org + * http://www.postfix.org + * https://www.rspamd.com + + * Debian community wiki: + * [[https://wiki.debian.org/Dovecot|Dovecot]] + * [[https://wiki.debian.org/Postfix|Postfix]] + +==== Client Apps ==== +Links to recommended email client apps can be found in !FreedomBox by select the Apps page, selecting the Dovecot/Postfix tile, and clicking the '''> Client Apps''' button. + + * [[FreedomBox/Manual/Roundcube|FreedomBox includes Roundcube client software.]] ## END_INCLUDE diff --git a/doc/manual/en/Infinoted.raw.wiki b/doc/manual/en/Infinoted.raw.wiki index 9dfd82c3b..1e95adc26 100644 --- a/doc/manual/en/Infinoted.raw.wiki +++ b/doc/manual/en/Infinoted.raw.wiki @@ -16,7 +16,7 @@ infinoted is a server for Gobby, a collaborative text editor. -To use it, [[https://gobby.github.io/|download Gobby]], desktop client and install it. Then start Gobby and select "Connect to Server" and enter your !FreedomBox's domain name. +To use it, download Gobby desktop client and install it. Then start Gobby and select "Connect to Server" and enter your !FreedomBox's domain name. === Port Forwarding === @@ -26,6 +26,8 @@ If your !FreedomBox is behind a router, you will need to set up port forwarding === Extenal links === * Website: https://gobby.github.io/libinfinity + * Gobby Client Software: https://gobby.github.io/ + * Gobby Wiki: https://github.com/gobby/gobby/wiki ## END_INCLUDE diff --git a/doc/manual/en/JSXC.raw.wiki b/doc/manual/en/JSXC.raw.wiki index 8ca57788f..c6fbff2bd 100644 --- a/doc/manual/en/JSXC.raw.wiki +++ b/doc/manual/en/JSXC.raw.wiki @@ -46,6 +46,7 @@ If your !FreedomBox is behind a router and you want to connect to other servers, * Website: https://www.jsxc.org * User documentation: https://www.jsxc.org/manual.html + * !FreedomBox ejabberd server manual: [[FreedomBox/Manual/ejabberd|https://wiki.debian.org/FreedomBox/Manual/ejabberd]] ## END_INCLUDE diff --git a/doc/manual/en/MatrixSynapse.raw.wiki b/doc/manual/en/MatrixSynapse.raw.wiki index eb4e36aac..e698d192a 100644 --- a/doc/manual/en/MatrixSynapse.raw.wiki +++ b/doc/manual/en/MatrixSynapse.raw.wiki @@ -76,8 +76,9 @@ echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3 === External links === * Matrix Website: https://matrix.org - * Synapse section:https://matrix.org/docs/projects/server/synapse - * User documentation: https://matrix.org/docs/guides + * Synapse section:https://github.com/element-hq/synapse + * User documentation: https://matrix.org/docs/chat_basics/matrix-for-im/ + * Debian Matrix wiki: https://wiki.debian.org/Matrix * Video tutorial for setting up Matrix Synapse on a Cloud instance: https://youtu.be/8snpMHHbymI ## END_INCLUDE diff --git a/doc/manual/en/MediaWiki.raw.wiki b/doc/manual/en/MediaWiki.raw.wiki index 61050e304..e8f97ec44 100644 --- a/doc/manual/en/MediaWiki.raw.wiki +++ b/doc/manual/en/MediaWiki.raw.wiki @@ -88,7 +88,9 @@ Administrators can choose a default skin from the app configuration. Users of th === External links === - * Website: https://www.mediawiki.org/wiki/MediaWiki + * Upstream Project: https://www.mediawiki.org/wiki/MediaWiki + * User documentation: https://www.mediawiki.org/wiki/Help:Contents + * Debian !MediaWiki wiki page: https://wiki.debian.org/MediaWiki ## END_INCLUDE diff --git a/doc/manual/en/Minetest.raw.wiki b/doc/manual/en/Minetest.raw.wiki index a6986edab..6fbe58dbf 100644 --- a/doc/manual/en/Minetest.raw.wiki +++ b/doc/manual/en/Minetest.raw.wiki @@ -43,6 +43,7 @@ After that, save your changes, restart minetest one more time, then you should b * Website: https://www.minetest.net * Wiki: https://wiki.minetest.net + * Using !Minetest in Education: https://www.minetest.net/education/ ## END_INCLUDE diff --git a/doc/manual/en/MiniDLNA.raw.wiki b/doc/manual/en/MiniDLNA.raw.wiki index d7023c199..a0e5d7e9d 100644 --- a/doc/manual/en/MiniDLNA.raw.wiki +++ b/doc/manual/en/MiniDLNA.raw.wiki @@ -8,13 +8,15 @@ ## BEGIN_INCLUDE -== MiniDLNA (Simple Media Server) == +== MiniDLNA / ReadyMedia (Simple Media Server) == || {{attachment:MiniDLNA-icon_en_V01.png|MiniDLNA icon}} || '''Available since''': version 19.23 MiniDLNA is a media server with the aim to be compliant with DLNA/UPnP clients. +Please know that the maintainers of MiniDLNA software are changing the name of this program to !ReadyMedia. + Note: This service is available only on networks configured as "internal" zone. It is not available when connected via [[FreedomBox/Manual/OpenVPN|OpenVPN]]. === What is UPnP/DLNA? === @@ -76,6 +78,7 @@ your language. === External links === * Upstream project site: http://minidlna.sourceforge.net + * Debian MiniDLNA wiki: https://wiki.debian.org/minidlna * About DLNA: https://en.wikipedia.org/wiki/Digital_Living_Network_Alliance ## END_INCLUDE diff --git a/doc/manual/en/Mumble.raw.wiki b/doc/manual/en/Mumble.raw.wiki index f8be8329d..87356fdad 100644 --- a/doc/manual/en/Mumble.raw.wiki +++ b/doc/manual/en/Mumble.raw.wiki @@ -33,7 +33,7 @@ A super user in Mumble has the ability to create administrator accounts who can === External links === - * Website: https://www.mumble.info + * Upstream Project: https://www.mumble.info * User documentation: https://www.mumble.info/documentation diff --git a/doc/manual/en/OpenVPN.raw.wiki b/doc/manual/en/OpenVPN.raw.wiki index df67dcd3f..550199549 100644 --- a/doc/manual/en/OpenVPN.raw.wiki +++ b/doc/manual/en/OpenVPN.raw.wiki @@ -137,6 +137,8 @@ Some services are known '''not''' to work at this time: === External Links === + * Upstream Project: https://openvpn.net/ + * Debian OpenVPN wiki: https://wiki.debian.org/OpenVPN * Wiki / Tracker: https://community.openvpn.net/openvpn ## END_INCLUDE diff --git a/doc/manual/en/Quassel.raw.wiki b/doc/manual/en/Quassel.raw.wiki index d0d30fff1..13e6c0ad7 100644 --- a/doc/manual/en/Quassel.raw.wiki +++ b/doc/manual/en/Quassel.raw.wiki @@ -91,7 +91,7 @@ By the way, the German verb ''quasseln'' means ''talking a lot'', to ''jabber''. === External links === - * Website: https://quassel-irc.org + * Upstream Project: https://quassel-irc.org * Wiki: https://bugs.quassel-irc.org/projects/quassel-irc/wiki diff --git a/doc/manual/en/RSSBridge.raw.wiki b/doc/manual/en/RSSBridge.raw.wiki index cf16de926..fb2a8d663 100644 --- a/doc/manual/en/RSSBridge.raw.wiki +++ b/doc/manual/en/RSSBridge.raw.wiki @@ -41,7 +41,7 @@ For a more detailed description of Tiny Tiny RSS, see [[FreedomBox/Manual/TinyTi === External links === - * Website: https://rss-bridge.github.io/rss-bridge/ + * Upstream Project: https://rss-bridge.github.io/rss-bridge/ * User documentation: https://rss-bridge.github.io/rss-bridge/General/Project_goals.html diff --git a/doc/manual/en/Radicale.raw.wiki b/doc/manual/en/Radicale.raw.wiki index 6f0b5bf28..46035b8a1 100644 --- a/doc/manual/en/Radicale.raw.wiki +++ b/doc/manual/en/Radicale.raw.wiki @@ -141,7 +141,9 @@ If you are using a contacts file exported from another service or application, i === External links === - * Website: https://radicale.org/3.0.html + * Upstream Project: https://radicale.org/3.0.html + * Debian Radicale wiki: https://wiki.debian.org/Radicale + * User Documentation: https://radicale.org/v3.html#documentation-1 ## END_INCLUDE diff --git a/doc/manual/en/RaspberryPi3B+.raw.wiki b/doc/manual/en/RaspberryPi3B+.raw.wiki index ba01fa000..fd7ec6753 100644 --- a/doc/manual/en/RaspberryPi3B+.raw.wiki +++ b/doc/manual/en/RaspberryPi3B+.raw.wiki @@ -10,7 +10,9 @@ Please do not expect any output on a monitor connected via HDMI to this device a === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 3 Model B+. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 3 Model B+. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. === Availability === diff --git a/doc/manual/en/RaspberryPi3B.raw.wiki b/doc/manual/en/RaspberryPi3B.raw.wiki index dc0fac6d5..7a42f4bbd 100644 --- a/doc/manual/en/RaspberryPi3B.raw.wiki +++ b/doc/manual/en/RaspberryPi3B.raw.wiki @@ -11,7 +11,9 @@ Please do not expect any output on a monitor connected via HDMI to this device a === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 3 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 3 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. === Availability === diff --git a/doc/manual/en/RaspberryPi4B.raw.wiki b/doc/manual/en/RaspberryPi4B.raw.wiki index a5b462cda..fae8006fc 100644 --- a/doc/manual/en/RaspberryPi4B.raw.wiki +++ b/doc/manual/en/RaspberryPi4B.raw.wiki @@ -6,7 +6,9 @@ === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 4 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card or USB drive and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 4 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card or USB drive and boot into !FreedomBox. === Booting from USB === diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 276d2b4e5..834d72e94 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,32 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.8 (2024-04-08) == + +=== Highlights === + + * gitweb: Fix an issue when cloning existing repository + * ttrss: Improve backup and restore of the database + * ttrss: Include dbconfig configuration file in backup + * zoph: Include dbconfig configuration file in backup + +=== Other Changes === + + * action_utils: Add generic utils for managing podman containers + * actions: Don't repeat action traceback in stderr + * diagnostics: Don't store list of app objects with results + * locale: Update translations for Albanian, Chinese (Simplified), Dutch, French, German, Norwegian Bokmål, Spanish, Turkish + * network: Skip bridge interfaces in connections list + * nextcloud: Add new app based on podman container + * Note: The Nextcloud app is currently disabled (not available to install). It will be made available after there has been more testing and review. + * Add backup/restore + * Add option to configure the default phone region + * Configure redis caching, create static PHP file + * ttrss: Ensure that database is removed after uninstall + * ttrss: tests: functional: Uninstall during backup/restore test + * upgrades: Re-enable unattended-upgrade during dist-upgrade + * zoph: Re-add a safety check when reading the setup state of the app + == FreedomBox 24.7 (2024-03-25) == === Highlights === diff --git a/doc/manual/en/Roundcube.raw.wiki b/doc/manual/en/Roundcube.raw.wiki index 99da700a3..9c102cdc6 100644 --- a/doc/manual/en/Roundcube.raw.wiki +++ b/doc/manual/en/Roundcube.raw.wiki @@ -39,7 +39,8 @@ If you wish to use Roundcube with your Gmail account, you need to first enable s === External links === - * Website: https://roundcube.net + * Upstream Project: https://roundcube.net + * User Documentation: https://roundcube.net/support/ ## END_INCLUDE diff --git a/doc/manual/en/Samba.raw.wiki b/doc/manual/en/Samba.raw.wiki index 3af479807..14104abdd 100644 --- a/doc/manual/en/Samba.raw.wiki +++ b/doc/manual/en/Samba.raw.wiki @@ -65,7 +65,8 @@ stored on a Samba share, the last one to save the file wins. === External links === - * Website: https://www.samba.org + * Upstream Project: https://www.samba.org + * Debian Samba wiki: https://wiki.debian.org/Samba * User documentation: https://www.samba.org/samba/docs diff --git a/doc/manual/en/Searx.raw.wiki b/doc/manual/en/Searx.raw.wiki index ac261d35c..2438c0958 100644 --- a/doc/manual/en/Searx.raw.wiki +++ b/doc/manual/en/Searx.raw.wiki @@ -55,7 +55,8 @@ Searx uses HTTP POST instead of GET by default to send your search queries to th === External links === - * Website: https://searx.me + * Upstream Project: https://searx.github.io/searx/ + * Searx wiki: https://github.com/searx/searx/wiki * User documentation: https://searx.github.io/searx/user/index.html diff --git a/doc/manual/en/SecureShell.raw.wiki b/doc/manual/en/SecureShell.raw.wiki index 8a01df5a0..9dc17a3da 100644 --- a/doc/manual/en/SecureShell.raw.wiki +++ b/doc/manual/en/SecureShell.raw.wiki @@ -41,6 +41,7 @@ The "fbx" user also has superuser privileges via ``sudo``. === Logging In === ==== Who can log in to FreedomBox by SSH? ==== + !FreedomBox administrative users may use SSH to to log in to !FreedomBox. The user 'fbx' is created by !FreedomBox and is an administrative super-user. There are options which allow ordinary users to log in: * SSH access can be granted to specific users in the Edit User page by selecting the option, "Remotely login using Secure Shell (SSH) (freedombox-ssh)" * SSH access can be granted globally to all users in the SSH configuration page by selecting the, "Allow all users to login remotely," option. @@ -48,6 +49,7 @@ The "fbx" user also has superuser privileges via ``sudo``. With a new !FreedomBox you may log in as fbx using ssh, and other ordinary users will be able to log in after adjusting the user or Secure Shell settings above in this section. The root user account will have no password set and will not be able to log in. ==== SSH Client Software ==== + SSH client in included in many operating systems including Linux, Microsoft Windows, and Apple MacOS. SSH is included in Chromebooks, but requires some configuration by the user. In most cases you can run SSH from a terminal or command prompt as shown here, using your !FreedomBox hostname or IP address: {{{ $ ssh freedombox.local @@ -56,6 +58,7 @@ $ ssh freedombox.local If your client computer does not have SSH available, PuTTY is a popular free software client program which complies with the Debian Free Software Guidelines. PuTTY has a graphical interface to remember and manage your SSH connections. See External links below for more information about PuTTY. ===== Cockpit as an SSH Alternative ===== + The Cockpit Server Administration Terminal app available from the Cockpit Tools menu is an alternative shell access tool to SSH. Like SSH your connection to a !FreedomBox terminal is secured. Cockpit is a good choice for users who do not wish to enable the SSH server or those who prefer to connect through a web browser. With either tool you will be presented with the !FreedomBox bash command line interface. Some users prefer to run SSH instead of, or in addition to, Cockpit. Command shell users tend to like SSH because it's something that they are already using. Users with Linux or Unix system administration experience tend to rely on this connection method because it is a simpler service which is thought to be more likely to be available if problems arise. @@ -70,12 +73,30 @@ To login via SSH, to your !FreedomBox: $ ssh fbx@freedombox.local }}} -Replace `fbx` with the name of the user you wish to login as. `freedombox` should be replaced with the hostname or IP address of you !FreedomBox device as found in the [[FreedomBox/Manual/QuickStart|Quick Start]] process. +Replace `fbx` with the name of the user you wish to login as. `fbx` and users in `admin` group will be able to login on the terminal directly. Other users will be denied access. -`fbx` and users in `admin` group will also be able to login on the terminal directly. Other users will be denied access. +`freedombox` should be replaced with the hostname. Alternatively, you can substitute the hostname by its IP address as found in the [[FreedomBox/Manual/QuickStart|Quick Start]] process: + +{{{ +$ ssh fbx@192.168.1.1 +}}} + +If your !FreedomBox has a domain name you can also use it: + +{{{ +$ ssh fbx@myfreedombox.freedombox.rocks +}}} If you repeatedly try to login as a user and fail, you will be blocked from logging in for some time. This is due to `libpam-abl` package that !FreedomBox installs by default. To control this behavior consult `libpam-abl` documentation. +Here we've used a .local network name (using multicast DNS), a local network IP address, and a DNS name to connect to !FreedomBox using SSH. + +==== SSH over the Internet ==== + +If your router is configured accordingly or your !FreedomBox is directly exposed to the internet, you can also use a public domain name or a public IP address in the same fashion we'd do for the local network. Multicast DNS won't work here, though. + +Let's look at connecting by SSH to !FreedomBox using other networks now. + ==== SSH over Tor ==== If in !FreedomBox you have enabled onion services via Tor, you can access your !FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. @@ -166,6 +187,7 @@ $ passwd This will ask you for your current password before giving you the opportunity to set a new one. === SSH Keys === + The next step for SSH security and convenience is to understand and use ssh keys. If you logged in to !FreedomBox the first time using ssh following the instructions above you specified a username and password to log in. In this section you'll learn about Server Fingerprints and host keys, authorized keys, and reasons to use these to make connection easier and more secure. By default SSH is configured to prefer to use keys while still allowing you to use a username and password to log in. At the end of this section you will be able to: @@ -174,6 +196,7 @@ By default SSH is configured to prefer to use keys while still allowing you to u * Further improve the security of your !FreedomBox by disabling SSH password authentication. ==== SSH Public and Private Keys ==== + SSH keys are generated in pairs called a key pair. There is a public key and a private key for each key pair. The public key encrypts data which can only be read using the private key, and the private key encrypts data which can only be read using the public key. This is called an asymmetric cryptography system. SSH will distribute your public keys automatically to the other connected system while keeping your private keys safe. Using SSH keys creates a powerful set of security features: @@ -185,6 +208,7 @@ Using SSH keys creates a powerful set of security features: * Your !FreedomBox can block any password guessing attack. ==== Create your personal SSH keys on your client computer using ssh-keygen ==== + You will create an SSH key pair on your client computer. We'll use the defaults and will not specify a password. Just press the Enter key when you are prompted for an SSH key password. This is very simple using the ssh-keygen command with no arguments. Here is how to run the command and a sample of the output the ssh-keygen program will give to you: {{{ $ ssh-keygen @@ -213,6 +237,7 @@ The key's randomart image is: That's all you need to do. You now have a personal SSH key pair on your client computer. ==== Verify your FreedomBox Server Fingerprint ==== + On your first time connecting to !FreedomBox using ssh you may have noticed a message similar to this: {{{ $ ssh fbx@freedombox.local @@ -245,6 +270,7 @@ Each time you connect to a new SSH server you will be given the opportunity to v Your server fingerprints are not private information. The fingerprint is a summary of a public key shared by the server which is used encrypt information sent to the SSH server. Your server public key is also not private information. You could share fingerprints and public keys with the world and the security of your !FreedomBox will not be diminished. ==== Share your personal SSH key with FreedomBox using ssh-copy-id ==== + By now you have a personal key pair, and you have verified the identity of !FreedomBox. !FreedomBox still does not know about your identity, and will ask you for your password when you try to log in by ssh. The ssh-copy-id program will tell !FreedomBox to accept your personal key as your password. {{{ $ ssh-copy-id username@freedombox.local @@ -296,6 +322,7 @@ Once you have added your client SSH key to !FreedomBox you will be able to conne * TOR .onion address if you are using TOR ==== Block SSH password guessing attempts by disabling password authentication ==== + Once you are able to connect to !FreedomBox by ssh using a key and not entering a password you can take a step to improve the security of !FreedomBox. If your !FreedomBox is accessible from the internet you may notice that there are repeated attempts to log in to your !FreedomBox from the internet. A good password is your first line of defense, and !FreedomBox has additional features which protect you from these intrusion attempts. You can stop this nonsense completely by disabling password authentication for Secure Shell. Go to your !FreedomBox System menu. Click the Secure Shell configuration link. Look under '''Configuration''' and select, "Disable password authentication" @@ -303,6 +330,48 @@ Go to your !FreedomBox System menu. Click the Secure Shell configuration link. L Click the, "Update setup," button and it's done. This will stop all password guessing intrusion attempts using ssh. You can log in using your key, and nobody else will be able to log in by guessing a password. +==== Remote Host Identification has Changed : What it means and what to do ==== + +You may eventually experience an alarming message when you try to log in to your !FreedomBox with SSH. You will see a message similar to this. + +{{{ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! +Someone could be eavesdropping on you right now (man-in-the-middle attack)! +It is also possible that a host key has just been changed. +The fingerprint for the RSA key sent by the remote host is +SHA256:ZGvgdxiDEpGKdw82Z6z0QRmDpT3Vgi07Ghba5IBJ4tQ. +Please contact your system administrator. +Add correct host key in /home/username/.ssh/known_hosts to get rid of this message. +Offending RSA key in /home/username/.ssh/known_hosts:2 + remove with: + ssh-keygen -f "/home/username/.ssh/known_hosts" -R "freedombox.freedombox.rocks" +Host key for freedombox.freedombox.rocks has changed and you have requested strict checking. +Host key verification failed. +}}} + +This message tells you something important. It's usually not threatening, but there is the possibility that an attack could be made on a computer or network which can also produce this. What's important is that you'll do the same thing in either case. + +The nature of this message is that the trust relationship you make with the SSH server through the fingerprint verification and key exchange with ssh-copy-id has been broken. Reading this error message closely, the issue is that the key fingerprint sent by !FreedomBox at connection time does not match the key stored on the SSH client at the time you did the fingerprint verification. This could mean a few different things: + * Your .ssh/known_hosts file on the client was modified or corrupted such that the stored fingerprint was altered. + * You generated new keys for the !FreedomBox SSH server. + * Your network has changed such that when you attempt SSH to !FreedomBox your connection goes elsewhere. This could happen if you change IP addresses on !FreedomBox and SSH to the old IP address, or it could happen by way of a sophisticated network attack. + +Fix this by removing the !FreedomBox entry from the client computer. On your laptop or desktop do the command as '''written exactly as in the the error message you receive''' (don't copy one from the message above!). + +{{{ +$ ssh-keygen -f /home/username/.ssh/known_hosts -R "freedombox.freedombox.rocks" +# Host freedombox.freedombox.rocks found: line 2 +# Host freedombox.freedombox.rocks found: line 3 +/home/username/.ssh/known_hosts updated. +Original contents retained as /home/username/.ssh/known_hosts.old +}}} + +In so doing you have removed the !FreedomBox fingerprint verification step we've done. Go back to the ''Verify your !FreedomBox Server Fingerprint'' section above and complete the steps again. For good measure, make an effort to see that you are connected to your own !FreedomBox in case you are being attacked. + + === External links === * Debian SSH wiki: https://wiki.debian.org/SSH diff --git a/doc/manual/en/Shaarli.raw.wiki b/doc/manual/en/Shaarli.raw.wiki index 8743a5852..e4416397a 100644 --- a/doc/manual/en/Shaarli.raw.wiki +++ b/doc/manual/en/Shaarli.raw.wiki @@ -22,7 +22,8 @@ Shaarli is personal (single-user) bookmarking application to install on your !Fr === External links === - * Usage documentation: https://shaarli.readthedocs.io/en/master/Usage.html + * Upstream Project: https://shaarli.readthedocs.io/en/master/index.html + * User documentation: https://shaarli.readthedocs.io/en/master/Usage.html ## END_INCLUDE diff --git a/doc/manual/en/Shadowsocks.raw.wiki b/doc/manual/en/Shadowsocks.raw.wiki index 7b66bc9ad..8a22927d7 100644 --- a/doc/manual/en/Shadowsocks.raw.wiki +++ b/doc/manual/en/Shadowsocks.raw.wiki @@ -56,7 +56,8 @@ If your !FreedomBox is behind a router, you will need to set up port forwarding === External links === - * Website: https://shadowsocks.org/ + * Upstream Project: https://shadowsocks.org/ + * User Documentation: https://shadowsocks.org/doc/what-is-shadowsocks.html ## END_INCLUDE diff --git a/doc/manual/en/Sharing.raw.wiki b/doc/manual/en/Sharing.raw.wiki index d2669907e..55a1d35ef 100644 --- a/doc/manual/en/Sharing.raw.wiki +++ b/doc/manual/en/Sharing.raw.wiki @@ -43,6 +43,12 @@ If you are user of !FreedomBox and your admin refuses to create shares for you, === Technicalities === Sharing will share the content using the built-in Apache web server. +=== External Links === + + * Upstream Project: https://projects.apache.org/project.html?httpd-http_server + * Debian Apache Wiki: https://wiki.debian.org/Apache + * User Documentation: https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html + ## END_INCLUDE Back to [[FreedomBox/Features|Features introduction]] or [[FreedomBox/Manual|manual]] pages. diff --git a/doc/manual/en/TinyTinyRSS.raw.wiki b/doc/manual/en/TinyTinyRSS.raw.wiki index 568e36069..354345c8c 100644 --- a/doc/manual/en/TinyTinyRSS.raw.wiki +++ b/doc/manual/en/TinyTinyRSS.raw.wiki @@ -91,6 +91,7 @@ To configure, first install the application, then in the setting page, set URL a === External links === * Website: https://tt-rss.org + * User Documentation: https://tt-rss.org/wiki.php diff --git a/doc/manual/en/Tor.raw.wiki b/doc/manual/en/Tor.raw.wiki index 340117ad2..112cdc129 100644 --- a/doc/manual/en/Tor.raw.wiki +++ b/doc/manual/en/Tor.raw.wiki @@ -91,7 +91,7 @@ If your ISP is trying to block Tor traffic, you can use tor bridge relays to con === External links === * Website: https://www.torproject.org - * User documentation: https://2019.www.torproject.org/docs/documentation.html.en + * User documentation: https://support.torproject.org/ ## END_INCLUDE diff --git a/doc/manual/en/Transmission.raw.wiki b/doc/manual/en/Transmission.raw.wiki index 3eefb0c9c..972b1cef4 100644 --- a/doc/manual/en/Transmission.raw.wiki +++ b/doc/manual/en/Transmission.raw.wiki @@ -57,13 +57,11 @@ In addition to using the web interface to control Transmission on !FreedomBox, d === External Links === - * Upstream projects: - * Transmission: https://transmissionbt.com - * !BitTorrent: https://www.bittorrent.org - * Protocol description: - * Upstream: https://www.bittorrent.org/introduction.html - * At Wikipedia: https://en.wikipedia.org/wiki/BitTorrent - + * Upstream Project: https://transmissionbt.com/ + * Debian Transmission Wiki: https://wiki.debian.org/Transmission + * User Support Forum: https://forum.transmissionbt.com/ + * !BitTorrent Introduction: https://www.bittorrent.org/introduction.html + * Wikipedia on !BitTorrent: https://en.wikipedia.org/wiki/BitTorrent ## END_INCLUDE diff --git a/doc/manual/en/WireGuard.raw.wiki b/doc/manual/en/WireGuard.raw.wiki index 4c8a6b06e..319f9ee3d 100644 --- a/doc/manual/en/WireGuard.raw.wiki +++ b/doc/manual/en/WireGuard.raw.wiki @@ -69,7 +69,9 @@ The advantage of this approach is that there is no need to transfer sensitive in === External Links === - * Website: https://www.wireguard.com + * Upstream Project: https://www.wireguard.com + * Debian !WireGuard Wiki: https://wiki.debian.org/WireGuard + * User Documentation: https://www.wireguard.com/quickstart/ ## END_INCLUDE diff --git a/doc/manual/en/WordPress.raw.wiki b/doc/manual/en/WordPress.raw.wiki index 0156a2f68..093cccb00 100644 --- a/doc/manual/en/WordPress.raw.wiki +++ b/doc/manual/en/WordPress.raw.wiki @@ -83,11 +83,11 @@ Since there are few plugins/themes packaged for Debian, !FreedomBox does not pro === External links === - * !WordPress website: https://wordpress.org - * Discover !WordPress plugins: https://wordpress.org/plugins/ - * Explore !WordPress themes: https://wordpress.org/themes/ - * !WordPress documentation: https://wordpress.org/support/ - * Google Fonts: https://en.wikipedia.org/wiki/Google_Fonts + * Upstream Project: https://wordpress.org + * Debian !WordPress Wiki: https://wiki.debian.org/WordPress + * User Documentation: https://wordpress.org/documentation/ + * !WordPress Customization: https://wordpress.org/documentation/customization/ + * Explore !WordPress themes: https://wordpress.org/themes/ ## END_INCLUDE diff --git a/doc/manual/en/Zoph.raw.wiki b/doc/manual/en/Zoph.raw.wiki index bf1120fc3..d3d6e5484 100644 --- a/doc/manual/en/Zoph.raw.wiki +++ b/doc/manual/en/Zoph.raw.wiki @@ -48,7 +48,7 @@ The database which holds information about albums, people etc is held in your no === External links === - * Website: http://www.zoph.org + * Upstream Project: http://www.zoph.org ## END_INCLUDE diff --git a/doc/manual/en/bepasty.raw.wiki b/doc/manual/en/bepasty.raw.wiki index d55cd6382..94e67a1cf 100644 --- a/doc/manual/en/bepasty.raw.wiki +++ b/doc/manual/en/bepasty.raw.wiki @@ -69,7 +69,7 @@ You can also configure Public Access, which sets the default permissions that ar === External links === * Upstream project: https://github.com/bepasty - * User documentation: https://bepasty-server.readthedocs.io/en/latest/user.html + * Upstream end user documentation: https://bepasty-server.readthedocs.io/en/latest/user.html ## END_INCLUDE diff --git a/doc/manual/en/ejabberd.raw.wiki b/doc/manual/en/ejabberd.raw.wiki index eb5136c52..96c17a036 100644 --- a/doc/manual/en/ejabberd.raw.wiki +++ b/doc/manual/en/ejabberd.raw.wiki @@ -138,22 +138,14 @@ Once you have logged in, you will be able to either start a conversation with on === External links === -==== Ejabberd ==== - * Website: https://www.ejabberd.im - * User documentation: https://docs.ejabberd.im + * Upstream project: https://www.ejabberd.im + * Upstream end user documentation: https://docs.ejabberd.im -==== Clients' sites ==== - * Conversations: https://conversations.im - * Gajim: https://gajim.org - * Dino: https://github.com/dino/dino - * Movim: https://movim.eu - * !ChatSecure: https://chatsecure.org - * Monal: https://monal.im - * Siskin: https://siskin.im +==== Client Apps ==== +Links to recommended client apps, where applicable, can be found in !FreedomBox by select the Apps page, selecting the application tile, and clicking the '''> Client Apps''' button. + + * [[FreedomBox/Manual/JSXC|FreedomBox includes JSXC client software]] -==== XMPP Protocol ==== - * Website: https://xmpp.org - * Summary at Wikipedia: https://en.wikipedia.org/wiki/XMPP ## END_INCLUDE diff --git a/doc/manual/es/Apache_userdir.raw.wiki b/doc/manual/es/Apache_userdir.raw.wiki index ebbb030dd..d32e4707c 100644 --- a/doc/manual/es/Apache_userdir.raw.wiki +++ b/doc/manual/es/Apache_userdir.raw.wiki @@ -114,8 +114,11 @@ Más acerca de ssh, scp y sftp con `$ man ssh`, `$ man scp` y `$ man sftp`. === Enlaces externos === - * Sitio web del proyecto original: https://httpd.apache.org/docs/2.4/mod/mod_userdir.html - * Documentación de uso: https://httpd.apache.org/docs/2.4/howto/public_html.html + * Sitio web del proyecto original: https://httpd.apache.org/ + * Apache en el wiki de Debian: https://wiki.debian.org/Apache + * Documentación de uso: + * https://httpd.apache.org/docs/2.4/mod/mod_userdir.html + * https://httpd.apache.org/docs/2.4/howto/public_html.html ## END_INCLUDE diff --git a/doc/manual/es/Calibre.raw.wiki b/doc/manual/es/Calibre.raw.wiki index ee95fb34b..0e91ddf07 100644 --- a/doc/manual/es/Calibre.raw.wiki +++ b/doc/manual/es/Calibre.raw.wiki @@ -31,6 +31,7 @@ Tras la instalación se puede acceder a Calibre mediante el cliente web en {{{ht === Enlaces externos === * Sitio web: https://calibre-ebook.com + * Manual de usuario: https://calibre-ebook.com/help ## END_INCLUDE diff --git a/doc/manual/es/Coturn.raw.wiki b/doc/manual/es/Coturn.raw.wiki index 57ac9431a..0878d0649 100644 --- a/doc/manual/es/Coturn.raw.wiki +++ b/doc/manual/es/Coturn.raw.wiki @@ -51,6 +51,7 @@ Si tu !FreedomBox está detrás de un router, necesitarás configurar la redirec === Enlaces externos === * Proyecto original: https://github.com/coturn/coturn + * Wiki de Coturn (quizá esté anticuado): https://github.com/coturn/coturn/wiki/ ## END_INCLUDE diff --git a/doc/manual/es/Deluge.raw.wiki b/doc/manual/es/Deluge.raw.wiki index 55b63239f..07db79d9a 100644 --- a/doc/manual/es/Deluge.raw.wiki +++ b/doc/manual/es/Deluge.raw.wiki @@ -51,6 +51,7 @@ En este punto ya estás usando ''Deluge''. Puedes hacer más cambios en las Pref * Proyectos originales: * Deluge: https://www.deluge-torrent.org * !BitTorrent: https://www.bittorrent.org + * Documentación de uso: https://dev.deluge-torrent.org/wiki/UserGuide * Descripciones del protocolo: * Del proyecto original: https://www.bittorrent.org/introduction.html * De Wikipedia: https://es.wikipedia.org/wiki/BitTorrent diff --git a/doc/manual/es/Email.raw.wiki b/doc/manual/es/Email.raw.wiki index 03b3a2e87..42dc2796a 100644 --- a/doc/manual/es/Email.raw.wiki +++ b/doc/manual/es/Email.raw.wiki @@ -212,6 +212,16 @@ El servidor de correo de !FreedomBox se presentó en la Debconf21. Las [[attachm * https://www.dovecot.org * https://www.rspamd.com + * Wiki de la comunidad Debian: + * [[https://wiki.debian.org/Dovecot|Dovecot]] + * [[https://wiki.debian.org/Postfix|Postfix]] + +==== Aplicaciones cliente ==== + +!FreedomBox recomienda algunas aplicaciones cliente. Selecciona su icono en la página de ''Aplicaciones'' y haz clic en el botón'''> Aplicaciones Cliente'''. + + * [[FreedomBox/Manual/Roundcube|FreedomBox incluye el software cliente Roundcube.]] + ## END_INCLUDE Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las páginas del [[es/FreedomBox/Manual|manual]]. diff --git a/doc/manual/es/Infinoted.raw.wiki b/doc/manual/es/Infinoted.raw.wiki index 7f9828ec0..00d9be635 100644 --- a/doc/manual/es/Infinoted.raw.wiki +++ b/doc/manual/es/Infinoted.raw.wiki @@ -22,7 +22,8 @@ Si tu !FreedomBox está detras de un router necesitarás configurar la redirecci === Enlaces extenos === * Sitio web: https://gobby.github.io/libinfinity - + * Software cliente para Gobby: https://gobby.github.io + * Wiki de Gobby: https://github.com/gobby/gobby/wiki ## END_INCLUDE diff --git a/doc/manual/es/JSXC.raw.wiki b/doc/manual/es/JSXC.raw.wiki index 36a71f66b..6db1846d3 100644 --- a/doc/manual/es/JSXC.raw.wiki +++ b/doc/manual/es/JSXC.raw.wiki @@ -46,6 +46,7 @@ Si tu !FreedomBox está detrás de un router y quieres conectarte a otros servid * Sitio web: https://www.jsxc.org * Documentación de uso: https://www.jsxc.org/manual.html + * Manual de !FreedomBox del servidor ejabberd: [[FreedomBox/Manual/ejabberd|https://wiki.debian.org/FreedomBox/Manual/ejabberd]] ## END_INCLUDE diff --git a/doc/manual/es/MatrixSynapse.raw.wiki b/doc/manual/es/MatrixSynapse.raw.wiki index 3eea26714..76d3c9920 100644 --- a/doc/manual/es/MatrixSynapse.raw.wiki +++ b/doc/manual/es/MatrixSynapse.raw.wiki @@ -81,11 +81,11 @@ Si tu !FreedomBox está detrás de un router, necesitarás configurar la redirec === Enlaces externos === * Sitio web de Matrix: https://matrix.org - * Sección de Synapse: https://matrix.org/docs/projects/server/synapse - * Documentación de uso: https://matrix.org/docs/guides+ + * Sección de Synapse: https://github.com/element-hq/synapse + * Documentación de uso: https://matrix.org/docs/chat_basics/matrix-for-im/ + * Matrix en el wiki de Debian : https://wiki.debian.org/Matrix * Video tutorial para instalar Matrix Synapse sobre una instancia en la nube: https://youtu.be/8snpMHHbymI - ## END_INCLUDE Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las páginas del [[es/FreedomBox/Manual|manual]]. diff --git a/doc/manual/es/MediaWiki.raw.wiki b/doc/manual/es/MediaWiki.raw.wiki index fc55b746b..1e9ed3638 100644 --- a/doc/manual/es/MediaWiki.raw.wiki +++ b/doc/manual/es/MediaWiki.raw.wiki @@ -82,7 +82,8 @@ Los administradores pueden elegir el tema por defecto desde la configuración de === Enlaces externos === * Sitio web: https://www.mediawiki.org/wiki/MediaWiki - + * Documentación de uso: https://www.mediawiki.org/wiki/Help:Contents + * !MediaWiki en el wiki de Debian: https://wiki.debian.org/MediaWiki ## END_INCLUDE diff --git a/doc/manual/es/Minetest.raw.wiki b/doc/manual/es/Minetest.raw.wiki index 74883b5bb..4ea66d4ac 100644 --- a/doc/manual/es/Minetest.raw.wiki +++ b/doc/manual/es/Minetest.raw.wiki @@ -40,6 +40,7 @@ Después, guarda los cambios, vuelve a reiniciar minetest y ya lo deberías tene * Sitio web: https://www.minetest.net * Wiki: https://wiki.minetest.net + * Usar !MineTest en educación: https://www.minetest.net/education/ ## END_INCLUDE diff --git a/doc/manual/es/MiniDLNA.raw.wiki b/doc/manual/es/MiniDLNA.raw.wiki index 9ca2a98ac..36abbe2a4 100644 --- a/doc/manual/es/MiniDLNA.raw.wiki +++ b/doc/manual/es/MiniDLNA.raw.wiki @@ -6,13 +6,15 @@ ## BEGIN_INCLUDE -== MiniDLNA (Servidor multimedia básico) == +== MiniDLNA / ReadyMedia (Servidor multimedia básico) == || {{attachment:FreedomBox/Manual/MiniDLNA/MiniDLNA-icon_en_V01.png|icono de MiniDLNA}} || '''Disponible desde''': versión 19.23 MiniDLNA es un servidor multimedia que intenta ser compatible con clientes DLNA/UPnP. +MiniDLNA ha cambiado recientemente su nombre a !ReadyMedia. + Nota: Este servicio solo está disponible en redes configuradas como zona "interna". Tampoco está disponble a través de [[es/FreedomBox/Manual/OpenVPN|OpenVPN]] (es incompatible). === ¿Qué es UPnP/DLNA? === @@ -62,6 +64,7 @@ Al usar un disco externo que se usa también desde sistemas Windows el mejor for * Sitio del proyecto original: http://minidlna.sourceforge.net (en) * Acerca de DLNA: https://es.wikipedia.org/wiki/Digital_Living_Network_Alliance + * MiniDLNA en el wiki de Debian: https://wiki.debian.org/minidlna ## END_INCLUDE diff --git a/doc/manual/es/OpenVPN.raw.wiki b/doc/manual/es/OpenVPN.raw.wiki index f266eb0a1..ea49db225 100644 --- a/doc/manual/es/OpenVPN.raw.wiki +++ b/doc/manual/es/OpenVPN.raw.wiki @@ -135,7 +135,9 @@ Algunos servicios '''no''' funcionan aún con OpenVPN: === Enlaces Externos === -* Wiki y Administrador de tareas: https://community.openvpn.net/openvpn + * Sitio web: https://openvpn.net/ + * OpenVPN en el wiki de Debian: https://wiki.debian.org/OpenVPN + * Wiki y Administrador de tareas: https://community.openvpn.net/openvpn ## END_INCLUDE diff --git a/doc/manual/es/Radicale.raw.wiki b/doc/manual/es/Radicale.raw.wiki index fc622f0ab..d47d9025a 100644 --- a/doc/manual/es/Radicale.raw.wiki +++ b/doc/manual/es/Radicale.raw.wiki @@ -141,6 +141,8 @@ Si estás usando un archivo de contactos exportado desde otro servicio o aplicac === Enlaces externos === * Website: https://radicale.org/3.0.html + * Documentación de uso: https://radicale.org/v3.html#documentation-1 + * Radicale en el wiki de Debian: https://wiki.debian.org/Radicale ## END_INCLUDE diff --git a/doc/manual/es/RaspberryPi3B+.raw.wiki b/doc/manual/es/RaspberryPi3B+.raw.wiki index ba01fa000..fd7ec6753 100644 --- a/doc/manual/es/RaspberryPi3B+.raw.wiki +++ b/doc/manual/es/RaspberryPi3B+.raw.wiki @@ -10,7 +10,9 @@ Please do not expect any output on a monitor connected via HDMI to this device a === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 3 Model B+. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 3 Model B+. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. === Availability === diff --git a/doc/manual/es/RaspberryPi3B.raw.wiki b/doc/manual/es/RaspberryPi3B.raw.wiki index dc0fac6d5..7a42f4bbd 100644 --- a/doc/manual/es/RaspberryPi3B.raw.wiki +++ b/doc/manual/es/RaspberryPi3B.raw.wiki @@ -11,7 +11,9 @@ Please do not expect any output on a monitor connected via HDMI to this device a === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 3 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 3 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card and boot into !FreedomBox. === Availability === diff --git a/doc/manual/es/RaspberryPi4B.raw.wiki b/doc/manual/es/RaspberryPi4B.raw.wiki index a5b462cda..fae8006fc 100644 --- a/doc/manual/es/RaspberryPi4B.raw.wiki +++ b/doc/manual/es/RaspberryPi4B.raw.wiki @@ -6,7 +6,9 @@ === Download === -!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are available. Download the "stable" or "testing" image for Raspberry Pi 4 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card or USB drive and boot into !FreedomBox. +Raspberry Pi recommends creating a bootable SD card with the [[https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager|Raspberry Pi Imager]] (rpi-imager), their official cross-platform utility that downloads an image and writes it to removable media. !FreedomBox "stable" and "testing" images can be selected in rpi-imager under the "Other specific-purpose OS" category. + +!FreedomBox SD card [[FreedomBox/Download|images]] for this hardware are also available online. Download the "stable" or "testing" image for Raspberry Pi 4 Model B. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card or USB drive and boot into !FreedomBox. === Booting from USB === diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 276d2b4e5..834d72e94 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,32 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.8 (2024-04-08) == + +=== Highlights === + + * gitweb: Fix an issue when cloning existing repository + * ttrss: Improve backup and restore of the database + * ttrss: Include dbconfig configuration file in backup + * zoph: Include dbconfig configuration file in backup + +=== Other Changes === + + * action_utils: Add generic utils for managing podman containers + * actions: Don't repeat action traceback in stderr + * diagnostics: Don't store list of app objects with results + * locale: Update translations for Albanian, Chinese (Simplified), Dutch, French, German, Norwegian Bokmål, Spanish, Turkish + * network: Skip bridge interfaces in connections list + * nextcloud: Add new app based on podman container + * Note: The Nextcloud app is currently disabled (not available to install). It will be made available after there has been more testing and review. + * Add backup/restore + * Add option to configure the default phone region + * Configure redis caching, create static PHP file + * ttrss: Ensure that database is removed after uninstall + * ttrss: tests: functional: Uninstall during backup/restore test + * upgrades: Re-enable unattended-upgrade during dist-upgrade + * zoph: Re-add a safety check when reading the setup state of the app + == FreedomBox 24.7 (2024-03-25) == === Highlights === diff --git a/doc/manual/es/Roundcube.raw.wiki b/doc/manual/es/Roundcube.raw.wiki index c7db81c6b..a3dc60136 100644 --- a/doc/manual/es/Roundcube.raw.wiki +++ b/doc/manual/es/Roundcube.raw.wiki @@ -39,6 +39,7 @@ Si quieres usar Roundcube con tu cuenta Gmail necesitas habilitar primero el ing === Enlaces externos === * Sitio web: https://roundcube.net + * Documentación de uso: https://roundcube.net/support/ ## END_INCLUDE diff --git a/doc/manual/es/Samba.raw.wiki b/doc/manual/es/Samba.raw.wiki index 7963d032f..e9090c927 100644 --- a/doc/manual/es/Samba.raw.wiki +++ b/doc/manual/es/Samba.raw.wiki @@ -58,6 +58,7 @@ Como Syncthing es primordialmente una solución de sincronización, tiene funcio * Sitio web: https://www.samba.org * Documentación de uso: https://www.samba.org/samba/docs + * Samba en el wiki de Debian: https://wiki.debian.org/Samba ## END_INCLUDE diff --git a/doc/manual/es/Searx.raw.wiki b/doc/manual/es/Searx.raw.wiki index f16d43c55..44ead14b0 100644 --- a/doc/manual/es/Searx.raw.wiki +++ b/doc/manual/es/Searx.raw.wiki @@ -54,7 +54,8 @@ Searx usa por defecto HTTP POST en vez de GET para enviar tus consultas de búsq === External links === - * Sitio web: https://searx.me + * Sitio web: https://searx.github.io/searx/ + * Wiki de Searx: https://github.com/searx/searx/wiki * Documentación de uso: https://searx.github.io/searx/user/index.html diff --git a/doc/manual/es/SecureShell.raw.wiki b/doc/manual/es/SecureShell.raw.wiki index 4414578a8..51496a3d9 100644 --- a/doc/manual/es/SecureShell.raw.wiki +++ b/doc/manual/es/SecureShell.raw.wiki @@ -78,14 +78,30 @@ Para ingresar mediante SSH a tu !FreedomBox: $ ssh fbx@freedombox }}} -Reemplaza `fbx` por el usuario con el que quieres ingresar. Hay que reemplazar `freedombox` por el hostname o dirección IP de tu dispositivo !FreedomBox como se indica en el proceso de [[es/FreedomBox/Manual/QuickStart|Inicio rápido]]. +Reemplaza `fbx` por el usuario con el que quieres ingresar. `fbx` es el usuario de !FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con !FreedomBox que pertenezca al grupo `admin` podrá ingresar. La cuenta `root` no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. -`fbx` es el usuario de !FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con !FreedomBox que pertenezca al grupo `admin` podrá ingresar. La cuenta `root` no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. +Hay que reemplazar `freedombox` por el hostname o dirección IP de tu dispositivo !FreedomBox como se indica en el proceso de [[es/FreedomBox/Manual/QuickStart|Inicio rápido]]: -`fbx` y los otros usuarios del grupo `admin` podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. +{{{ +$ ssh fbx@192.168.1.1 +}}} + +Si tu !FreedomBox tiene un nombre de dominio asignado también puedes usarlo: + +{{{ +$ ssh fbx@mifreedombox.freedombox.rocks +}}} Si fallas repetidamente intentando ingresar se te bloqueará el acceso por algún tiempo. Esto se debe al paquete `libpam-abl` que !FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de `libpam-abl`. +En esta seccion hemos usado el nombre de la máquina con la extensión `.local` (usando ''multicast DNS''), una dirección IP local, y un nombre de dominio para conectar a !FreedomBox por SSH. + +==== SSH desde Internet ==== + +Si tu router está configurado al efecto para tu !FreedomBox o la tienes directamente expuesta a internet puedes usar también un nombre de dominio o dirección IP públicos del mismo modo que en la red local. Pero el ''Multicast DNS'' no funciona desde internet. + +Veámos ahora cómo conectar a !FreedomBox por SSH usando otras redes. + ==== SSH via Tor ==== Si tienes habilitados en !FreedomBox los servicios Tor Onion puedes acceder a tu !FreedomBox mediante ssh sobre Tor. Instala `netcat-openbsd`. @@ -319,6 +335,48 @@ Estos pasos solo se necesitan la primera vez que conectamos con !FreedomBox. Quizá necesites repetirlos al conectar mediante la dirección IP o los nombres de la máquina en la red local o desde fuera de ella. En cada caso recibirás la misma Huella de Servidor que podrás verificar la primera vez. +==== La Identificación Remota de la Máquina ha Cambiado : ¿Qué Significa y Qué Hacer? ==== + +En algún momento quizá te topes con un mensaje alarmante como este al intentar acceder a tu !FreedomBox con SSH: + +{{{ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! +Someone could be eavesdropping on you right now (man-in-the-middle attack)! +It is also possible that a host key has just been changed. +The fingerprint for the RSA key sent by the remote host is +SHA256:ZGvgdxiDEpGKdw82Z6z0QRmDpT3Vgi07Ghba5IBJ4tQ. +Please contact your system administrator. +Add correct host key in /home/username/.ssh/known_hosts to get rid of this message. +Offending RSA key in /home/username/.ssh/known_hosts:2 + remove with: + ssh-keygen -f "/home/username/.ssh/known_hosts" -R "freedombox.freedombox.rocks" +Host key for freedombox.freedombox.rocks has changed and you have requested strict checking. +Host key verification failed. +}}} + +Este mensaje es importante. Normalmente no es grave pero podría ser consecuencia de un ataque. Lo importante es que siempre actúes siempre con prudencia. + +Este mensaje viene a decir que la relación de confianza con el servidor SSH a través de la verificación de su huella y el intercambio de claves con `ssh-copy-id` se ha roto. +Leyendo detenidamente el mensaje, dice que la huella enviada por !FreedomBox al conectar no coincide con la registrada en el cliente SSH cuando se verificó. Esto puede indicar cosas diferentes: + * El fichero `.ssh/known_hosts` de to cliente ha sido modificado se ha corrompido de tal modo que la huella se ha alterado. + * Has generado claves nuevas para tu servidor !FreedomBox SSH. + * Tu red ha cambiado de tal modo que al intentar acceder a tu !FreedomBox tu conexión se desvía y llega a otro sitio. Esto puede pasar si tras cambiar la dirección IP de tu !FreedomBox sigues inentando acceder a la antigua, o podría ser un ataque de red sofisticado. + +Aregla esto borrando el registro de tu !FreedomBox en el ordenador cliente. Ejecuta este comando '''con los datos del mensaje de error que recibes''' (¡No lo copies del ejemplo anterior!). + +{{{ +$ ssh-keygen -f /home/username/.ssh/known_hosts -R "freedombox.freedombox.rocks" +# Host freedombox.freedombox.rocks found: line 2 +# Host freedombox.freedombox.rocks found: line 3 +/home/username/.ssh/known_hosts updated. +Original contents retained as /home/username/.ssh/known_hosts.old +}}} + +Haciendo esto has anulado la verificación de huella de tu !FreedomBox. Vuelve a la sección ''Verificar la Huella de tu Servidor FreedomBox'' y repitela. Asegúrate así de que te conectas a tu !FreedomBox en caso de ataque. + === Enlaces externos === * Proyecto original: https://www.openssh.com diff --git a/doc/manual/es/Shaarli.raw.wiki b/doc/manual/es/Shaarli.raw.wiki index c6e92ab00..66b821292 100644 --- a/doc/manual/es/Shaarli.raw.wiki +++ b/doc/manual/es/Shaarli.raw.wiki @@ -20,6 +20,7 @@ Shaarli es un marcapáginas personal (de usuario único) para instalar en tu !F === Enlaces externos === + * Sitio web: https://shaarli.readthedocs.io/en/master/index.html * Documentación de uso: https://shaarli.readthedocs.io/en/master/Usage/ diff --git a/doc/manual/es/Shadowsocks.raw.wiki b/doc/manual/es/Shadowsocks.raw.wiki index 280637450..95407b953 100644 --- a/doc/manual/es/Shadowsocks.raw.wiki +++ b/doc/manual/es/Shadowsocks.raw.wiki @@ -56,6 +56,7 @@ Si tu FreedomBox está detrás de un router, necesitarás configurar la redirecc === Enlaces externos === * Sitio web: https://shadowsocks.org + * Documentación de uso: https://shadowsocks.org/doc/what-is-shadowsocks.html ## END_INCLUDE diff --git a/doc/manual/es/Sharing.raw.wiki b/doc/manual/es/Sharing.raw.wiki index 64edde0e4..f8448b905 100644 --- a/doc/manual/es/Sharing.raw.wiki +++ b/doc/manual/es/Sharing.raw.wiki @@ -42,6 +42,11 @@ Si eres usuario de !FreedomBox y tu administrador se niega a crearte comparticio === Tecnicismos === ''Sharing'' compartirá el contenido usando el servidor web Apache que viene de serie. +=== Enlaces externos === + + * Sitio web: https://projects.apache.org/project.html?httpd-http_server + * Apache en el wiki de Debian: https://wiki.debian.org/Apache + * Documentación de uso: https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html ## END_INCLUDE diff --git a/doc/manual/es/TinyTinyRSS.raw.wiki b/doc/manual/es/TinyTinyRSS.raw.wiki index 2621a8cd1..71dbdfde2 100644 --- a/doc/manual/es/TinyTinyRSS.raw.wiki +++ b/doc/manual/es/TinyTinyRSS.raw.wiki @@ -136,6 +136,7 @@ Por ejemplo, el subreddit de !FreedomBox es {{{https://www.reddit.com/r/Freedomb === Enlaces externos === * Sitio web: https://tt-rss.org + * Documentación de uso: https://tt-rss.org/wiki.php ## END_INCLUDE diff --git a/doc/manual/es/Tor.raw.wiki b/doc/manual/es/Tor.raw.wiki index f569c1cb1..e52427a9b 100644 --- a/doc/manual/es/Tor.raw.wiki +++ b/doc/manual/es/Tor.raw.wiki @@ -77,8 +77,7 @@ Si tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor pue === Enlaces externos === * Sitio web: https://www.torproject.org - * Documentación de uso: https://2019.www.torproject.org/docs/documentation.html.en - + * Documentación de uso: https://support.torproject.org ## END_INCLUDE diff --git a/doc/manual/es/WireGuard.raw.wiki b/doc/manual/es/WireGuard.raw.wiki index 252b380b4..5cb238e50 100644 --- a/doc/manual/es/WireGuard.raw.wiki +++ b/doc/manual/es/WireGuard.raw.wiki @@ -65,6 +65,8 @@ La ventaja de este enfoque es que no hay necesidad de software adicional ni de t === Enlaces externos === * Sitio web: https://www.wireguard.com + * Documentación de uso: https://www.wireguard.com/quickstart/ + * !WireGuard en el wiki de Debian: https://wiki.debian.org/WireGuard ## END_INCLUDE diff --git a/doc/manual/es/WordPress.raw.wiki b/doc/manual/es/WordPress.raw.wiki index 4f515d77e..a333aa61f 100644 --- a/doc/manual/es/WordPress.raw.wiki +++ b/doc/manual/es/WordPress.raw.wiki @@ -81,10 +81,10 @@ Como hay pocos plugins/temas empaquetados para Debian, !FreedomBox no proporcion === Enlaces externos === * Sitio web de !WordPress: https://wordpress.org - * ''Plugins'' para !WordPress: https://wordpress.org/plugins - * Temas para !WordPress: https://wordpress.org/themes - * Documentación de !WordPress: https://wordpress.org/support - * Google Fonts: https://en.wikipedia.org/wiki/Google_Fonts + * !WordPress en el wiki de Debian: https://wiki.debian.org/WordPress + * Documentación de uso: https://wordpress.org/documentation + * Personalización de !WordPress: https://wordpress.org/documentation/customization + * Temas de !WordPress: https://wordpress.org/themes ## END_INCLUDE diff --git a/doc/manual/es/ejabberd.raw.wiki b/doc/manual/es/ejabberd.raw.wiki index e57bc4cd7..11efc8397 100644 --- a/doc/manual/es/ejabberd.raw.wiki +++ b/doc/manual/es/ejabberd.raw.wiki @@ -135,19 +135,16 @@ Una vez ingreses podrás comenzar una conversación con algún contacto XMPP o u === Enlaces externos === ==== Ejabberd ==== + * Sitio web: https://www.ejabberd.im * Documentación de uso: https://docs.ejabberd.im -==== Sitios de aplicaciones cliente ==== - * Conversations: https://conversations.im - * Gajim: https://gajim.org - * Dino: https://dino.im - * Movim: https://movim.eu - * !ChatSecure: https://chatsecure.org - * Monal: https://monal.im - * Siskin: https://siskin.im +==== Aplicaciones cliente ==== + +!FreedomBox recomienda algunas aplicaciones cliente. Selecciona su icono en la página de ''Aplicaciones'' y haz clic en el botón'''> Aplicaciones Cliente'''. ==== Protocolo XMPP ==== + * Sitio web: https://xmpp.org * Resumen en Wikipedia: https://en.wikipedia.org/wiki/XMPP From 4bbff86ff3f3e415633ab9eaaf5607db731aff8f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 8 Apr 2024 20:21:35 -0700 Subject: [PATCH 29/30] doc: Fetch latest manual Signed-off-by: Sunil Mohan Adapa --- doc/manual/es/SecureShell.raw.wiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/es/SecureShell.raw.wiki b/doc/manual/es/SecureShell.raw.wiki index 51496a3d9..1d230f2f0 100644 --- a/doc/manual/es/SecureShell.raw.wiki +++ b/doc/manual/es/SecureShell.raw.wiki @@ -375,7 +375,7 @@ $ ssh-keygen -f /home/username/.ssh/known_hosts -R "freedombox.freedombox.rocks" Original contents retained as /home/username/.ssh/known_hosts.old }}} -Haciendo esto has anulado la verificación de huella de tu !FreedomBox. Vuelve a la sección ''Verificar la Huella de tu Servidor FreedomBox'' y repitela. Asegúrate así de que te conectas a tu !FreedomBox en caso de ataque. +Haciendo esto has anulado la verificación de huella de tu !FreedomBox. Vuelve a la sección ''Verificar la Huella de tu Servidor !FreedomBox'' y repitela. Asegúrate así de que te conectas a tu !FreedomBox en caso de ataque. === Enlaces externos === From 0a701994346cfaaefdbe58692d369620c33436c5 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 9 Apr 2024 07:26:04 -0400 Subject: [PATCH 30/30] Release v24.8 to unstable Signed-off-by: James Valleroy --- debian/changelog | 57 ++++++++++++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 16e722f78..a656f9644 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,60 @@ +freedombox (24.8) unstable; urgency=medium + + [ Burak Yavuz ] + * Translated using Weblate (Turkish) + + [ 大王叫我来巡山 ] + * Translated using Weblate (Chinese (Simplified)) + + [ Besnik Bleta ] + * Translated using Weblate (Albanian) + + [ gallegonovato ] + * Translated using Weblate (Spanish) + + [ John Doe ] + * Translated using Weblate (French) + * Translated using Weblate (French) + + [ Allan Nordhøy ] + * Translated using Weblate (Norwegian Bokmål) + + [ Veiko Aasa ] + * gitweb: Fix an issue when cloning existing repository + + [ Benedek Nagy ] + * network: Skip of bridge interfaces in connections list + * action_utils: Add generic utils for managing podman containers + * nextcloud: Add new app based on podman container + * nextcloud: Add backup/restore + * nextcloud: Add option to configure the default phone region + * nextcloud: Configure redis caching, create static PHP file + + [ Sunil Mohan Adapa ] + * nextcloud: Diasble app until more testing and review changes + * zoph: Re-add a safety check when reading the setup state of the app + * zoph: Include dbconfig configuration file in backup + * ttrss: Include dbconfig configuration file in backup + * ttrss: tests: functional: Uninstall during backup/restore test + * ttrss: Improve backup and restore of the database + * ttrss: Ensure that database is removed after uninstall + * actions: Don't repeat action traceback in stderr + * doc: Fetch latest manual + + [ ikmaak ] + * Translated using Weblate (Dutch) + + [ James Valleroy ] + * upgrades: Re-enable unattended-upgrade during dist-upgrade + * diagnostics: Don't store list of app objects with results + * locale: Update translation strings + * doc: Fetch latest manual + + [ Johannes Keyser ] + * Translated using Weblate (German) + + -- James Valleroy Tue, 09 Apr 2024 07:24:57 -0400 + freedombox (24.7) unstable; urgency=medium [ Sunil Mohan Adapa ] diff --git a/plinth/__init__.py b/plinth/__init__.py index f0715b040..a464ed722 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '24.7' +__version__ = '24.8'