From 855c81ecc6efd8ddf363a59ef75b1e106f1f151f Mon Sep 17 00:00:00 2001 From: daria Date: Tue, 19 Dec 2023 15:01:52 +0200 Subject: [PATCH 01/72] add outline to focused elements --- customize.dist/src/less2/include/toolbar.less | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/customize.dist/src/less2/include/toolbar.less b/customize.dist/src/less2/include/toolbar.less index 2f66891d6..4bdef746c 100644 --- a/customize.dist/src/less2/include/toolbar.less +++ b/customize.dist/src/less2/include/toolbar.less @@ -360,11 +360,9 @@ .cp-toolbar { * { - outline-width: 0; + outline-style: none; &:focus { - outline-width: 1rem; - // color shows on chrome/edge, but not firefox - outline-color: grey; // XXX temporary color to change + outline: blue solid 2px; } } @@ -767,6 +765,7 @@ padding: 10px; color: @toolbar-bg-color; color: var(--toolbar-bg-color); + border-radius: 5px; span { font-size: 45px; From f5b429c4748d47f5305cdc47ebd1eaa1b169f900 Mon Sep 17 00:00:00 2001 From: daria Date: Tue, 19 Dec 2023 15:21:47 +0200 Subject: [PATCH 02/72] change outline color --- customize.dist/src/less2/include/toolbar.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/toolbar.less b/customize.dist/src/less2/include/toolbar.less index 7146d5436..12c3736fc 100644 --- a/customize.dist/src/less2/include/toolbar.less +++ b/customize.dist/src/less2/include/toolbar.less @@ -367,7 +367,7 @@ * { outline-style: none; &:focus { - outline: blue solid 2px; + outline: @cryptpad_color_brand solid 2px; } } From a108e64175e7d68e6c3695c5bbebba136b4f1918 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:10 +0100 Subject: [PATCH 03/72] Translated using Weblate (Ukrainian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.0% (1144 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/uk/ Translation: CryptPad/App --- www/common/translations/messages.uk.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.uk.json b/www/common/translations/messages.uk.json index a0b3f28ec..914fe77e5 100644 --- a/www/common/translations/messages.uk.json +++ b/www/common/translations/messages.uk.json @@ -1031,7 +1031,6 @@ "calendar_hours": "Години", "calendar_minutes": "Хвилини", "calendar_allDay": "Весь день", - "calendar_location": "Місце: {0}", "calendar_loc": "Місце", "calendar_title": "Заголовок", "calendar_update": "Оновити", From 10ba682d1f34b73d7cc31e985f83740f2b64b2b5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:10 +0100 Subject: [PATCH 04/72] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.2% (1417 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/cs/ Translation: CryptPad/App --- www/common/translations/messages.cs.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.cs.json b/www/common/translations/messages.cs.json index f57b72c40..8769febb3 100644 --- a/www/common/translations/messages.cs.json +++ b/www/common/translations/messages.cs.json @@ -635,7 +635,6 @@ "calendar_hours": "Hodin", "calendar_minutes": "Minut", "calendar_allDay": "Celý den", - "calendar_location": "Místo: {0}", "calendar_loc": "Místo", "calendar_title": "Nadpis", "calendar_update": "Uložit", From a884c163e8b9b2f56a451d14148e242be6dea747 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:11 +0100 Subject: [PATCH 05/72] Translated using Weblate (Spanish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.9% (1547 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es/ Translation: CryptPad/App --- www/common/translations/messages.es.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index 896967246..2c3df1e42 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -950,7 +950,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "Todo el día", - "calendar_location": "Localización: {0}", "calendar_loc": "Localización", "calendar_title": "Título", "calendar_dateTimeRange": "{0} {1} - {2}", From 6505b2f7252a2c5457ca3570c6a3c484caddf65a Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:11 +0100 Subject: [PATCH 06/72] Translated using Weblate (Chinese (Simplified)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.4% (1505 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/zh_Hans/ Translation: CryptPad/App --- www/common/translations/messages.zh.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.zh.json b/www/common/translations/messages.zh.json index 5f36f370a..604e64ab9 100644 --- a/www/common/translations/messages.zh.json +++ b/www/common/translations/messages.zh.json @@ -1236,7 +1236,6 @@ "calendar_hours": "小时", "calendar_minutes": "分钟", "calendar_allDay": "全天", - "calendar_location": "位置:{0}", "calendar_loc": "地点", "calendar_title": "标题", "calendar_update": "更新", From 2f7c45477df2a50b0b1538b55d99fc10bcb06798 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:12 +0100 Subject: [PATCH 07/72] Translated using Weblate (Catalan) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.5% (1085 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ca/ Translation: CryptPad/App --- www/common/translations/messages.ca.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ca.json b/www/common/translations/messages.ca.json index 8485bdf19..1854164ef 100644 --- a/www/common/translations/messages.ca.json +++ b/www/common/translations/messages.ca.json @@ -1421,7 +1421,6 @@ "calendar_deleteTeamConfirm": "Esteu segur que voleu suprimir aquest calendari de l'equip?", "calendar_deleteOwned": "Continuarà sent visible per a altres usuaris amb els quals s'ha compartit.", "calendar_newEvent": "Esdeveniment nou", - "calendar_location": "Ubicació: {0}", "calendar_more": "{0} més", "reminder_missed": "{0} va tenir lloc el {1}", "reminder_now": "{0} ha començat", From 0ba6d208887674ad9ba6170c74be86cab1736947 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:12 +0100 Subject: [PATCH 08/72] Translated using Weblate (Finnish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.0% (1228 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fi/ Translation: CryptPad/App --- www/common/translations/messages.fi.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.fi.json b/www/common/translations/messages.fi.json index 04002ceae..a4881c436 100644 --- a/www/common/translations/messages.fi.json +++ b/www/common/translations/messages.fi.json @@ -1173,7 +1173,6 @@ "calendar_update": "Päivitä", "calendar_title": "Otsikko", "calendar_loc": "Sijainti", - "calendar_location": "Sijainti: {0}", "calendar_allDay": "Koko päivä", "calendar_minutes": "Minuutit", "calendar_hours": "Tunnit", From a7ac895bf8f53049b9521f173d1b5bdb38ffe4f9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:13 +0100 Subject: [PATCH 09/72] Translated using Weblate (Indonesian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.0% (1666 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/id/ Translation: CryptPad/App --- www/common/translations/messages.id.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.id.json b/www/common/translations/messages.id.json index 3a927a872..334172693 100644 --- a/www/common/translations/messages.id.json +++ b/www/common/translations/messages.id.json @@ -915,7 +915,6 @@ "calendar_default": "Kalender saya", "calendar_new": "Kalender baru", "calendar_newEvent": "Acara baru", - "calendar_location": "Lokasi: {0}", "calendar_allDay": "Seharian", "reminder_inProgressAllDay": "Hari ini: {0}", "admin_supportPrivButton": "Tampilkan kunci", From 33dcdfb09913f7b57b1ece216d97a0b8da67b124 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:13 +0100 Subject: [PATCH 10/72] Translated using Weblate (Italian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.9% (1160 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/it/ Translation: CryptPad/App --- www/common/translations/messages.it.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.it.json b/www/common/translations/messages.it.json index 099b208fc..cf769477a 100644 --- a/www/common/translations/messages.it.json +++ b/www/common/translations/messages.it.json @@ -1098,7 +1098,6 @@ "broadcast_end": "Termina", "broadcast_maintenance": "Una manutenzione è programmata tra {0} e {1}. CryptPad potrebbe non essere disponibile in quel lasso di tempo.", "admin_surveyTitle": "Sondaggio", - "calendar_location": "Posizione: {0}", "admin_surveyButton": "Salva sondaggio", "admin_surveyActive": "Apri sondaggio", "calendar_minutes": "Minuti", From ce6037f95af63003e59a7c371175a5e0d25f2518 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:14 +0100 Subject: [PATCH 11/72] Translated using Weblate (Japanese) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.2% (1619 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ja/ Translation: CryptPad/App --- www/common/translations/messages.ja.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ja.json b/www/common/translations/messages.ja.json index 1c139d00e..f3239c85b 100644 --- a/www/common/translations/messages.ja.json +++ b/www/common/translations/messages.ja.json @@ -940,7 +940,6 @@ "calendar_hours": "時間", "calendar_minutes": "分", "calendar_allDay": "全日", - "calendar_location": "場所: {0}", "calendar_loc": "場所", "calendar_title": "タイトル", "calendar_update": "更新", From fc6549b8302a076f7cc7360e1be745d95860aaa7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:14 +0100 Subject: [PATCH 12/72] Translated using Weblate (Dutch) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 37.9% (638 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/nl/ Translation: CryptPad/App --- www/common/translations/messages.nl.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.nl.json b/www/common/translations/messages.nl.json index b8cc5dd72..022193059 100644 --- a/www/common/translations/messages.nl.json +++ b/www/common/translations/messages.nl.json @@ -522,7 +522,6 @@ "calendar_import": "Voeg toe aan mijn agenda's", "calendar_dateTimeRange": "{0} {1} - {2}", "calendar_title": "Titel", - "calendar_location": "Plaats: {0}", "calendar_minutes": "Minuten", "calendar_addNotification": "Voeg herinnering toe", "register_registrationIsClosed": "Registratie is gesloten.", From 2e79ad7fd26b555be37955b50918b5cd1269866a Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:15 +0100 Subject: [PATCH 13/72] Translated using Weblate (Polish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.1% (1381 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pl/ Translation: CryptPad/App --- www/common/translations/messages.pl.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pl.json b/www/common/translations/messages.pl.json index 06a49e655..f86939792 100644 --- a/www/common/translations/messages.pl.json +++ b/www/common/translations/messages.pl.json @@ -899,7 +899,6 @@ "calendar_hours": "Godziny", "calendar_minutes": "Minuty", "calendar_allDay": "Cały dzień", - "calendar_location": "Lokalizacja: {0}", "calendar_loc": "Lokalizacja", "calendar_title": "Tytuł", "calendar_update": "Zaktualizuj", From b73a83edc74136f8cbe5a37c531a2f40cedc897f Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:15 +0100 Subject: [PATCH 14/72] Translated using Weblate (Portuguese (Brazil)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.9% (1664 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pt_BR/ Translation: CryptPad/App --- www/common/translations/messages.pt-br.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pt-br.json b/www/common/translations/messages.pt-br.json index 7159d8b03..8026159d8 100644 --- a/www/common/translations/messages.pt-br.json +++ b/www/common/translations/messages.pt-br.json @@ -1235,7 +1235,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "O dia todo", - "calendar_location": "Localização: {0}", "calendar_loc": "Local", "calendar_title": "Título", "calendar_update": "Atualizar", From 0b8bb5ebf61f1bd920d37e4d8e6a7af4444a26c2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:15 +0100 Subject: [PATCH 15/72] Translated using Weblate (Portuguese (Portugal)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 80.6% (1356 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pt_PT/ Translation: CryptPad/App --- www/common/translations/messages.pt-pt.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pt-pt.json b/www/common/translations/messages.pt-pt.json index 4be7f68b0..e6c82a531 100644 --- a/www/common/translations/messages.pt-pt.json +++ b/www/common/translations/messages.pt-pt.json @@ -1234,7 +1234,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "O dia todo", - "calendar_location": "Localização: {0}", "calendar_loc": "Local", "calendar_title": "Título", "calendar_update": "Atualizar", From 47db10b06cd510d8ec19767c254c98a3d8208ac3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:16 +0100 Subject: [PATCH 16/72] Translated using Weblate (Russian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.7% (1577 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ru/ Translation: CryptPad/App --- www/common/translations/messages.ru.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ru.json b/www/common/translations/messages.ru.json index 6ee081441..355ff6335 100644 --- a/www/common/translations/messages.ru.json +++ b/www/common/translations/messages.ru.json @@ -1337,7 +1337,6 @@ "calendar_hours": "Часа(ов)", "calendar_minutes": "Минут(ы)", "calendar_allDay": "Весь день", - "calendar_location": "Место: {0}", "calendar_loc": "Место", "calendar_title": "Заголовок", "calendar_update": "Обновить", From fd237544c8f0ec8eb483e0fc74fdaf2c5554a309 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:16 +0100 Subject: [PATCH 17/72] Translated using Weblate (Swedish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.0% (1666 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/sv/ Translation: CryptPad/App --- www/common/translations/messages.sv.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.sv.json b/www/common/translations/messages.sv.json index e8c903b0c..6f3aafa9b 100644 --- a/www/common/translations/messages.sv.json +++ b/www/common/translations/messages.sv.json @@ -650,7 +650,6 @@ "calendar_month": "Månad", "calendar_title": "Rubrik", "calendar_noNotification": "Ingen", - "calendar_location": "Plats: {0}", "settings_notifCalendarTitle": "Kalenderaviseringar", "mediatag_defaultImageName": "bild", "share_formAuditor": "Granskare", From 9404288a1ea2190dec2bbc1c611200608c9c6886 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:17 +0100 Subject: [PATCH 18/72] Translated using Weblate (Arabic) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.3% (1620 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ar/ Translation: CryptPad/App --- www/common/translations/messages.ar.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ar.json b/www/common/translations/messages.ar.json index e9a1d3bc5..f69f365ab 100644 --- a/www/common/translations/messages.ar.json +++ b/www/common/translations/messages.ar.json @@ -1165,7 +1165,6 @@ "calendar_update": "حَدِّثْ", "calendar_title": "عنوان", "calendar_loc": "موقع", - "calendar_location": "الموقع: {0}", "calendar_hours": "ساعات", "calendar_noNotification": "بدون إشعار", "calendar_allDay": "طوال اليوم", From b14cdacc5cb1973b4b28ba333ed15ccb7616080a Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:17 +0100 Subject: [PATCH 19/72] Translated using Weblate (Basque) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.8% (1662 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/eu/ Translation: CryptPad/App --- www/common/translations/messages.eu.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.eu.json b/www/common/translations/messages.eu.json index f83f56c13..827b1bde0 100644 --- a/www/common/translations/messages.eu.json +++ b/www/common/translations/messages.eu.json @@ -1048,7 +1048,6 @@ "calendar_hours": "Orduak", "calendar_minutes": "Minutuak", "calendar_allDay": "Egunero", - "calendar_location": "Kokapena: {0}", "calendar_loc": "Kokapena", "calendar_title": "Izena", "calendar_update": "Eguneratu", From 7f31282d867ffdb2760861fe5a56c3c747f9e997 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:18 +0100 Subject: [PATCH 20/72] Translated using Weblate (German) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (German) Currently translated at 99.1% (1667 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Jan Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/de/ Translation: CryptPad/App --- www/common/translations/messages.de.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 34a175d68..8528dc3f3 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -479,7 +479,7 @@ "mdToolbar_list": "Aufzählung", "mdToolbar_check": "Aufgabenliste", "mdToolbar_code": "Code", - "home_host": "Dies ist eine unabhängige Installation der CrypPad-Software.", + "home_host": "Dies ist eine unabhängige Instanz von CryptPad.", "main_catch_phrase": "Suite zur Zusammenarbeit
Ende-zu-Ende-verschlüsselt und quelloffen", "about": "Über uns", "privacy": "Datenschutzerklärung", @@ -1167,7 +1167,6 @@ "calendar_hours": "Stunden", "calendar_minutes": "Minuten", "calendar_allDay": "Ganztägig", - "calendar_location": "Ort: {0}", "calendar_loc": "Ort", "calendar_title": "Titel", "calendar_update": "Aktualisieren", @@ -1667,5 +1666,20 @@ "status": "Statusseite", "access_passwordUsed": "Dieses Passwort wurde bereits für dieses Dokument verwendet. Es kann nicht erneut verwendet werden.", "admin_diskUsageWarning": "Mit Vorsicht zu verwenden! Je nach Größe der auf der Instanz gespeicherten Daten kann die Erstellung dieses Berichts den gesamten auf dem Server verfügbaren Speicher verbrauchen und zu einem Absturz führen.", - "dph_sf_destroyed": "Geteilter Ordner {0} wurde vom Eigentümer zerstört" + "dph_sf_destroyed": "Geteilter Ordner {0} wurde vom Eigentümer zerstört", + "calendar_desc": "Beschreibung", + "admin_forcemfaHint": "Alle Benutzer dieser Instanz werden aufgefordert, eine Zwei-Faktor-Authentifizierung für die Anmeldung bei ihrem Account einzurichten.", + "ssoauth_form_hint_register": "Füge ein CryptPad-Passwort für zusätzliche Sicherheit hinzu oder lasse es leer und fahre fort. Wenn du kein Passwort hinzufügst, können die Administratoren der Instanz auf die Schlüssel zum Schutz deiner Daten zugreifen.", + "ssoauth_form_hint_login": "Bitte gib dein CryptPad-Passwort ein", + "loading_mfa_required": "Auf dieser Instanz ist eine Zwei-Faktor-Authentifizierung erforderlich. Bitte aktualisiere deinen Account mit einer Authentifizierungs-App und dem folgenden Formular.", + "calendar_description": "Beschreibung:{0}{1}", + "duplicate": "Duplizieren", + "kanban_hideTags": "Weniger Tags anzeigen", + "kanban_showTags": "Alle Tags anzeigen", + "sso_login_description": "Einloggen mit", + "sso_register_description": "Registrieren mit", + "ssoauth_header": "CryptPad-Passwort", + "calendar_rec_change": "Ein sich wiederholendes Ereignis wird in einen anderen Kalender verschoben. Du kannst diese Änderung nur auf dieses Ereignis oder alle wiederholten Ereignisse anwenden.", + "calendar_rec_change_first": "Das erste sich wiederholende Ereignis wird in einen anderen Kalender verschoben. Alle wiederholten Ereignisse werden ebenfalls verschoben.", + "admin_forcemfaTitle": "Verpflichtende Zwei-Faktor-Authentifizierung" } From 746012678103089dc151ef82d06440349e1d42b5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 16:14:18 +0100 Subject: [PATCH 21/72] Translated using Weblate (French) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (French) Currently translated at 99.8% (1679 of 1682 strings) Translated using Weblate (French) Currently translated at 100.0% (1679 of 1679 strings) Translated using Weblate (French) Currently translated at 100.0% (1676 of 1676 strings) Co-authored-by: David Benqué Co-authored-by: Mathilde Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fr/ Translation: CryptPad/App --- www/common/translations/messages.fr.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 5fcd1e670..fa1822cb0 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1155,7 +1155,6 @@ "calendar_hours": "Heures", "calendar_minutes": "Minutes", "calendar_allDay": "Journée entière", - "calendar_location": "Lieu : {0}", "calendar_loc": "Lieu", "calendar_title": "Titre", "calendar_update": "Modifier", @@ -1679,5 +1678,8 @@ "sso_login_description": "Se connecter avec", "duplicate": "Dupliquer", "kanban_showTags": "Voir toutes les étiquettes", - "kanban_hideTags": "Voir moins d'étiquettes" + "kanban_hideTags": "Voir moins d'étiquettes", + "admin_forcemfaTitle": "Authentification à deux facteurs obligatoire", + "admin_forcemfaHint": "Tous les utilisateurs de cette instance seront obligés d'activer l'authentification à deux facteurs pour se connecter à leur compte.", + "loading_mfa_required": "L'authentification à deux facteurs est requise pour cette instance. Veuillez mettre à jour votre compte en utilisant une application d'authentification et le formulaire ci-dessous." } From c87f052f006d3d1ce56d156422d2a5dd76380e9c Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:55 +0100 Subject: [PATCH 22/72] Translated using Weblate (Ukrainian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.0% (1144 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/uk/ Translation: CryptPad/App --- www/common/translations/messages.uk.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.uk.json b/www/common/translations/messages.uk.json index a0b3f28ec..914fe77e5 100644 --- a/www/common/translations/messages.uk.json +++ b/www/common/translations/messages.uk.json @@ -1031,7 +1031,6 @@ "calendar_hours": "Години", "calendar_minutes": "Хвилини", "calendar_allDay": "Весь день", - "calendar_location": "Місце: {0}", "calendar_loc": "Місце", "calendar_title": "Заголовок", "calendar_update": "Оновити", From 14cf88c02b2aa6f6b7a0682a0761fed2665294c6 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:55 +0100 Subject: [PATCH 23/72] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.2% (1417 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/cs/ Translation: CryptPad/App --- www/common/translations/messages.cs.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.cs.json b/www/common/translations/messages.cs.json index f57b72c40..8769febb3 100644 --- a/www/common/translations/messages.cs.json +++ b/www/common/translations/messages.cs.json @@ -635,7 +635,6 @@ "calendar_hours": "Hodin", "calendar_minutes": "Minut", "calendar_allDay": "Celý den", - "calendar_location": "Místo: {0}", "calendar_loc": "Místo", "calendar_title": "Nadpis", "calendar_update": "Uložit", From b6a1514f07a1618499ade8a73760e348b34a64fb Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:55 +0100 Subject: [PATCH 24/72] Translated using Weblate (Spanish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.9% (1547 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es/ Translation: CryptPad/App --- www/common/translations/messages.es.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index 896967246..2c3df1e42 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -950,7 +950,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "Todo el día", - "calendar_location": "Localización: {0}", "calendar_loc": "Localización", "calendar_title": "Título", "calendar_dateTimeRange": "{0} {1} - {2}", From c2f66383c471d0fb88fd8d4bed1d38137f97ceb8 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:56 +0100 Subject: [PATCH 25/72] Translated using Weblate (Chinese (Simplified)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.4% (1505 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/zh_Hans/ Translation: CryptPad/App --- www/common/translations/messages.zh.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.zh.json b/www/common/translations/messages.zh.json index 5f36f370a..604e64ab9 100644 --- a/www/common/translations/messages.zh.json +++ b/www/common/translations/messages.zh.json @@ -1236,7 +1236,6 @@ "calendar_hours": "小时", "calendar_minutes": "分钟", "calendar_allDay": "全天", - "calendar_location": "位置:{0}", "calendar_loc": "地点", "calendar_title": "标题", "calendar_update": "更新", From 72ad8754e6f7be5bda15691a0a7ae8c14986db8f Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:56 +0100 Subject: [PATCH 26/72] Translated using Weblate (Catalan) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.5% (1085 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ca/ Translation: CryptPad/App --- www/common/translations/messages.ca.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ca.json b/www/common/translations/messages.ca.json index 8485bdf19..1854164ef 100644 --- a/www/common/translations/messages.ca.json +++ b/www/common/translations/messages.ca.json @@ -1421,7 +1421,6 @@ "calendar_deleteTeamConfirm": "Esteu segur que voleu suprimir aquest calendari de l'equip?", "calendar_deleteOwned": "Continuarà sent visible per a altres usuaris amb els quals s'ha compartit.", "calendar_newEvent": "Esdeveniment nou", - "calendar_location": "Ubicació: {0}", "calendar_more": "{0} més", "reminder_missed": "{0} va tenir lloc el {1}", "reminder_now": "{0} ha començat", From 9fd710bd9015b37d5a71d094b6da6a18fcf897d5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:57 +0100 Subject: [PATCH 27/72] Translated using Weblate (Finnish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.0% (1228 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fi/ Translation: CryptPad/App --- www/common/translations/messages.fi.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.fi.json b/www/common/translations/messages.fi.json index 04002ceae..a4881c436 100644 --- a/www/common/translations/messages.fi.json +++ b/www/common/translations/messages.fi.json @@ -1173,7 +1173,6 @@ "calendar_update": "Päivitä", "calendar_title": "Otsikko", "calendar_loc": "Sijainti", - "calendar_location": "Sijainti: {0}", "calendar_allDay": "Koko päivä", "calendar_minutes": "Minuutit", "calendar_hours": "Tunnit", From cbd65f108908e3d2edcd5aa90c42dd7c415887dc Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:57 +0100 Subject: [PATCH 28/72] Translated using Weblate (Indonesian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.0% (1666 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/id/ Translation: CryptPad/App --- www/common/translations/messages.id.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.id.json b/www/common/translations/messages.id.json index 3a927a872..334172693 100644 --- a/www/common/translations/messages.id.json +++ b/www/common/translations/messages.id.json @@ -915,7 +915,6 @@ "calendar_default": "Kalender saya", "calendar_new": "Kalender baru", "calendar_newEvent": "Acara baru", - "calendar_location": "Lokasi: {0}", "calendar_allDay": "Seharian", "reminder_inProgressAllDay": "Hari ini: {0}", "admin_supportPrivButton": "Tampilkan kunci", From 803b5e0b8f07a6987d1b3242e9821e8e41ccc7eb Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:58 +0100 Subject: [PATCH 29/72] Translated using Weblate (Italian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.9% (1160 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/it/ Translation: CryptPad/App --- www/common/translations/messages.it.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.it.json b/www/common/translations/messages.it.json index 099b208fc..cf769477a 100644 --- a/www/common/translations/messages.it.json +++ b/www/common/translations/messages.it.json @@ -1098,7 +1098,6 @@ "broadcast_end": "Termina", "broadcast_maintenance": "Una manutenzione è programmata tra {0} e {1}. CryptPad potrebbe non essere disponibile in quel lasso di tempo.", "admin_surveyTitle": "Sondaggio", - "calendar_location": "Posizione: {0}", "admin_surveyButton": "Salva sondaggio", "admin_surveyActive": "Apri sondaggio", "calendar_minutes": "Minuti", From 9302b46197be75da5610a39fff48969ebaf3d44a Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:58 +0100 Subject: [PATCH 30/72] Translated using Weblate (Japanese) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.2% (1619 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ja/ Translation: CryptPad/App --- www/common/translations/messages.ja.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ja.json b/www/common/translations/messages.ja.json index 1c139d00e..f3239c85b 100644 --- a/www/common/translations/messages.ja.json +++ b/www/common/translations/messages.ja.json @@ -940,7 +940,6 @@ "calendar_hours": "時間", "calendar_minutes": "分", "calendar_allDay": "全日", - "calendar_location": "場所: {0}", "calendar_loc": "場所", "calendar_title": "タイトル", "calendar_update": "更新", From 31f82c3306e2f75ee5815cd4797c339724ff60b4 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:59 +0100 Subject: [PATCH 31/72] Translated using Weblate (Dutch) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 37.9% (638 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/nl/ Translation: CryptPad/App --- www/common/translations/messages.nl.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.nl.json b/www/common/translations/messages.nl.json index b8cc5dd72..022193059 100644 --- a/www/common/translations/messages.nl.json +++ b/www/common/translations/messages.nl.json @@ -522,7 +522,6 @@ "calendar_import": "Voeg toe aan mijn agenda's", "calendar_dateTimeRange": "{0} {1} - {2}", "calendar_title": "Titel", - "calendar_location": "Plaats: {0}", "calendar_minutes": "Minuten", "calendar_addNotification": "Voeg herinnering toe", "register_registrationIsClosed": "Registratie is gesloten.", From 67b362be2f695215b7b1f8e0cf91a9327cdd19d4 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:58:59 +0100 Subject: [PATCH 32/72] Translated using Weblate (Polish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.1% (1381 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pl/ Translation: CryptPad/App --- www/common/translations/messages.pl.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pl.json b/www/common/translations/messages.pl.json index 06a49e655..f86939792 100644 --- a/www/common/translations/messages.pl.json +++ b/www/common/translations/messages.pl.json @@ -899,7 +899,6 @@ "calendar_hours": "Godziny", "calendar_minutes": "Minuty", "calendar_allDay": "Cały dzień", - "calendar_location": "Lokalizacja: {0}", "calendar_loc": "Lokalizacja", "calendar_title": "Tytuł", "calendar_update": "Zaktualizuj", From 30bc01d28eed2524ccac7cc59046bc42967ae882 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:00 +0100 Subject: [PATCH 33/72] Translated using Weblate (Portuguese (Brazil)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.9% (1664 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pt_BR/ Translation: CryptPad/App --- www/common/translations/messages.pt-br.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pt-br.json b/www/common/translations/messages.pt-br.json index 7159d8b03..8026159d8 100644 --- a/www/common/translations/messages.pt-br.json +++ b/www/common/translations/messages.pt-br.json @@ -1235,7 +1235,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "O dia todo", - "calendar_location": "Localização: {0}", "calendar_loc": "Local", "calendar_title": "Título", "calendar_update": "Atualizar", From ad97cc987c1eb6a97ca5b7d04edff6c529aebad8 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:00 +0100 Subject: [PATCH 34/72] Translated using Weblate (Portuguese (Portugal)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 80.6% (1356 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/pt_PT/ Translation: CryptPad/App --- www/common/translations/messages.pt-pt.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.pt-pt.json b/www/common/translations/messages.pt-pt.json index 4be7f68b0..e6c82a531 100644 --- a/www/common/translations/messages.pt-pt.json +++ b/www/common/translations/messages.pt-pt.json @@ -1234,7 +1234,6 @@ "calendar_hours": "Horas", "calendar_minutes": "Minutos", "calendar_allDay": "O dia todo", - "calendar_location": "Localização: {0}", "calendar_loc": "Local", "calendar_title": "Título", "calendar_update": "Atualizar", From a1ba90f87738f39267f64256d37cfbeb5267365d Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:01 +0100 Subject: [PATCH 35/72] Translated using Weblate (Russian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.7% (1577 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ru/ Translation: CryptPad/App --- www/common/translations/messages.ru.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ru.json b/www/common/translations/messages.ru.json index 6ee081441..355ff6335 100644 --- a/www/common/translations/messages.ru.json +++ b/www/common/translations/messages.ru.json @@ -1337,7 +1337,6 @@ "calendar_hours": "Часа(ов)", "calendar_minutes": "Минут(ы)", "calendar_allDay": "Весь день", - "calendar_location": "Место: {0}", "calendar_loc": "Место", "calendar_title": "Заголовок", "calendar_update": "Обновить", From 5f5a28484f60ca3ad0d0b61670d02980aff24e1b Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:01 +0100 Subject: [PATCH 36/72] Translated using Weblate (Swedish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.0% (1666 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/sv/ Translation: CryptPad/App --- www/common/translations/messages.sv.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.sv.json b/www/common/translations/messages.sv.json index e8c903b0c..6f3aafa9b 100644 --- a/www/common/translations/messages.sv.json +++ b/www/common/translations/messages.sv.json @@ -650,7 +650,6 @@ "calendar_month": "Månad", "calendar_title": "Rubrik", "calendar_noNotification": "Ingen", - "calendar_location": "Plats: {0}", "settings_notifCalendarTitle": "Kalenderaviseringar", "mediatag_defaultImageName": "bild", "share_formAuditor": "Granskare", From d23972bce99bdbfd2dc8fdf6da5be6d280268b30 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:02 +0100 Subject: [PATCH 37/72] Translated using Weblate (Arabic) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.3% (1620 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/ar/ Translation: CryptPad/App --- www/common/translations/messages.ar.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.ar.json b/www/common/translations/messages.ar.json index e9a1d3bc5..f69f365ab 100644 --- a/www/common/translations/messages.ar.json +++ b/www/common/translations/messages.ar.json @@ -1165,7 +1165,6 @@ "calendar_update": "حَدِّثْ", "calendar_title": "عنوان", "calendar_loc": "موقع", - "calendar_location": "الموقع: {0}", "calendar_hours": "ساعات", "calendar_noNotification": "بدون إشعار", "calendar_allDay": "طوال اليوم", From 3e2e48a294935813a5832f06a0d5821b9e7335e9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:02 +0100 Subject: [PATCH 38/72] Translated using Weblate (Basque) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.8% (1662 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/eu/ Translation: CryptPad/App --- www/common/translations/messages.eu.json | 1 - 1 file changed, 1 deletion(-) diff --git a/www/common/translations/messages.eu.json b/www/common/translations/messages.eu.json index f83f56c13..827b1bde0 100644 --- a/www/common/translations/messages.eu.json +++ b/www/common/translations/messages.eu.json @@ -1048,7 +1048,6 @@ "calendar_hours": "Orduak", "calendar_minutes": "Minutuak", "calendar_allDay": "Egunero", - "calendar_location": "Kokapena: {0}", "calendar_loc": "Kokapena", "calendar_title": "Izena", "calendar_update": "Eguneratu", From c615a97997fa3531db154e58598a6a3351239c62 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:03 +0100 Subject: [PATCH 39/72] Translated using Weblate (German) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (German) Currently translated at 99.1% (1667 of 1682 strings) Co-authored-by: David Benqué Co-authored-by: Jan Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/de/ Translation: CryptPad/App --- www/common/translations/messages.de.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 34a175d68..8528dc3f3 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -479,7 +479,7 @@ "mdToolbar_list": "Aufzählung", "mdToolbar_check": "Aufgabenliste", "mdToolbar_code": "Code", - "home_host": "Dies ist eine unabhängige Installation der CrypPad-Software.", + "home_host": "Dies ist eine unabhängige Instanz von CryptPad.", "main_catch_phrase": "Suite zur Zusammenarbeit
Ende-zu-Ende-verschlüsselt und quelloffen", "about": "Über uns", "privacy": "Datenschutzerklärung", @@ -1167,7 +1167,6 @@ "calendar_hours": "Stunden", "calendar_minutes": "Minuten", "calendar_allDay": "Ganztägig", - "calendar_location": "Ort: {0}", "calendar_loc": "Ort", "calendar_title": "Titel", "calendar_update": "Aktualisieren", @@ -1667,5 +1666,20 @@ "status": "Statusseite", "access_passwordUsed": "Dieses Passwort wurde bereits für dieses Dokument verwendet. Es kann nicht erneut verwendet werden.", "admin_diskUsageWarning": "Mit Vorsicht zu verwenden! Je nach Größe der auf der Instanz gespeicherten Daten kann die Erstellung dieses Berichts den gesamten auf dem Server verfügbaren Speicher verbrauchen und zu einem Absturz führen.", - "dph_sf_destroyed": "Geteilter Ordner {0} wurde vom Eigentümer zerstört" + "dph_sf_destroyed": "Geteilter Ordner {0} wurde vom Eigentümer zerstört", + "calendar_desc": "Beschreibung", + "admin_forcemfaHint": "Alle Benutzer dieser Instanz werden aufgefordert, eine Zwei-Faktor-Authentifizierung für die Anmeldung bei ihrem Account einzurichten.", + "ssoauth_form_hint_register": "Füge ein CryptPad-Passwort für zusätzliche Sicherheit hinzu oder lasse es leer und fahre fort. Wenn du kein Passwort hinzufügst, können die Administratoren der Instanz auf die Schlüssel zum Schutz deiner Daten zugreifen.", + "ssoauth_form_hint_login": "Bitte gib dein CryptPad-Passwort ein", + "loading_mfa_required": "Auf dieser Instanz ist eine Zwei-Faktor-Authentifizierung erforderlich. Bitte aktualisiere deinen Account mit einer Authentifizierungs-App und dem folgenden Formular.", + "calendar_description": "Beschreibung:{0}{1}", + "duplicate": "Duplizieren", + "kanban_hideTags": "Weniger Tags anzeigen", + "kanban_showTags": "Alle Tags anzeigen", + "sso_login_description": "Einloggen mit", + "sso_register_description": "Registrieren mit", + "ssoauth_header": "CryptPad-Passwort", + "calendar_rec_change": "Ein sich wiederholendes Ereignis wird in einen anderen Kalender verschoben. Du kannst diese Änderung nur auf dieses Ereignis oder alle wiederholten Ereignisse anwenden.", + "calendar_rec_change_first": "Das erste sich wiederholende Ereignis wird in einen anderen Kalender verschoben. Alle wiederholten Ereignisse werden ebenfalls verschoben.", + "admin_forcemfaTitle": "Verpflichtende Zwei-Faktor-Authentifizierung" } From b8c686d1694952b46295f042d63f4f65ea6a953a Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 15:59:03 +0100 Subject: [PATCH 40/72] Translated using Weblate (French) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (French) Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (French) Currently translated at 100.0% (1681 of 1681 strings) Translated using Weblate (French) Currently translated at 99.8% (1679 of 1682 strings) Translated using Weblate (French) Currently translated at 100.0% (1679 of 1679 strings) Translated using Weblate (French) Currently translated at 100.0% (1676 of 1676 strings) Co-authored-by: David Benqué Co-authored-by: Mathilde Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fr/ Translation: CryptPad/App --- www/common/translations/messages.fr.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 5fcd1e670..fd9ab2939 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1155,7 +1155,6 @@ "calendar_hours": "Heures", "calendar_minutes": "Minutes", "calendar_allDay": "Journée entière", - "calendar_location": "Lieu : {0}", "calendar_loc": "Lieu", "calendar_title": "Titre", "calendar_update": "Modifier", @@ -1671,13 +1670,16 @@ "calendar_rec_change_first": "Déplacer le premier événement répété vers un autre calendrier. Tous les autres événements seront aussi déplacés.", "calendar_desc": "Description", "sso_register_description": "S'enregistrer avec", - "calendar_description": "Description:{0}{1}", + "calendar_description": "Description : {0}{1}", "ssoauth_header": "Mot de passe CryptPad", "ssoauth_form_hint_login": "Veuillez entrer votre mot de passe CryptPad", "ssoauth_form_hint_register": "Ajouter un mot de passe CryptPad pour plus de sécurité ou laisser vide et continuer. Si vous n'ajoutez pas de mot de passe, les clés protégeant vos données seront accessibles aux administrateur·ices de l'instance.", "calendar_rec_change": "Déplacer un événement répété vers un autre calendrier. Vous pouvez appliquer ce changement seulement pour cet événement ou pour tous les événements répétés.", "sso_login_description": "Se connecter avec", "duplicate": "Dupliquer", - "kanban_showTags": "Voir toutes les étiquettes", - "kanban_hideTags": "Voir moins d'étiquettes" + "kanban_showTags": "Voir tous les mots-clés", + "kanban_hideTags": "Voir moins de mots-clés", + "admin_forcemfaTitle": "Authentification à deux facteurs obligatoire", + "admin_forcemfaHint": "Tous les utilisateurs de cette instance seront obligés d'activer l'authentification à deux facteurs pour se connecter à leur compte.", + "loading_mfa_required": "L'authentification à deux facteurs est requise pour cette instance. Veuillez mettre à jour votre compte en utilisant une application d'authentification et le formulaire ci-dessous." } From e377577364e950499e87f7d2db32ce2a842c3817 Mon Sep 17 00:00:00 2001 From: David Benque Date: Wed, 20 Dec 2023 15:24:55 +0000 Subject: [PATCH 41/72] Update Changelog --- CHANGELOG.md | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a227a522..87109b4e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,120 @@ SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and cont SPDX-License-Identifier: AGPL-3.0-or-later --> +# 5.6.0 + + +## Goals + +This release introduces support for integrating CryptPad instances with Single-Sign On authentication. It brings a lot of improvements and fixes to Form, Calendar, and other parts of CryptPad. This release begins to improve the accessibility of the toolbar towards full WCAG compliance which we hope to achieve in the near future. + +## Features + +- Authentication + - This version paves the way for SSO authentication for a CryptPad instance via a plugin (est. release Jan. 2024) [#1320](https://github.com/cryptpad/cryptpad/pull/1320) + - New setting to make Two-Factor Authentication mandatory for all user accounts on an instance [#1341](https://github.com/cryptpad/cryptpad/pull/1341) +- Form + - New button to duplicate a question [#1305](https://github.com/cryptpad/cryptpad/pull/1305) +- Calendar + - New description field for calendar events [#1299](https://github.com/cryptpad/cryptpad/pull/1299) + +## Improvements + +- Accessibility of toolbars and some drop-down menus [#1290](https://github.com/cryptpad/cryptpad/pull/1290) + - "+ New" drop-down menu in Drive and Team Drive #1191 + - New `Ctrl + e` modal #1192 + - Code contact request notifications as headings #1197 + - DOM order of toolbar #1198 + - Notifications menu not accessible via Keyboard #1201 + - Sidebar "tabs" not accessible via keyboard #1203 + - Implement keyboard navigation of toolbar menus #1209 + - CryptDrive page needs a logical tab order #1151 + - Elements not accessible using the keyboard #1162 + - Calendar event modal date-picker is cut-off at some screen resolutions #1280 + - Visible focus #1206 +- Rich Text + - Improvements to the Rich Text toolbar and layout for mobile usage [#1296](https://github.com/cryptpad/cryptpad/pull/1296) +- Calendar + - Handling the move of repeating events from a calendar to another [#1308](https://github.com/cryptpad/cryptpad/pull/1308) +- Kanban + - Changed positioning of kanban tag container on smaller screens [#1307](https://github.com/cryptpad/cryptpad/pull/1307) +- New option to increase the number of teams slots for premium users only [#1315](https://github.com/cryptpad/cryptpad/pull/1315) +- Improve licensing information, CryptPad code now complies with the [REUSE](https://reuse.software/) specifications [#1300](https://github.com/cryptpad/cryptpad/pull/1300) +- Deployment + - Basic configuration for Apache HTTPd [#1332](https://github.com/cryptpad/cryptpad/pull/1332) + - Add Docker health check [#1287](https://github.com/cryptpad/cryptpad/pull/1287) +- Cleanup + - Old // XXX comments [#1334](https://github.com/cryptpad/cryptpad/pull/1334) + - Outdated/misplaced files [#1327](https://github.com/cryptpad/cryptpad/pull/1327) + +## Fixes + +- Fix browser autocomplete issues (password, numbers, etc.) [#1342](https://github.com/cryptpad/cryptpad/pull/1342) +- Drive + - Container height fills screen [#1304](https://github.com/cryptpad/cryptpad/pull/1304) + - Context menu on mobile [#1301](https://github.com/cryptpad/cryptpad/pull/1301) +- OnlyOffice applications + - Use correct mime type for .wasm files (export functionality) [#1288](https://github.com/cryptpad/cryptpad/pull/1288) + - Fix filter functionality in Sheets [#1319](https://github.com/cryptpad/cryptpad/issues/1319) +- Form + - Fix an error upon importing a template in forms [#1316](https://github.com/cryptpad/cryptpad/pull/1316) + - Can now set form closing date/time on mobile [#1305](https://github.com/cryptpad/cryptpad/pull/1305) + - Can now edit time options for poll questions on mobile [#1305](https://github.com/cryptpad/cryptpad/pull/1305) + - Dates in CSV exports of forms are now in ISO (not timestamp) format [#1305](https://github.com/cryptpad/cryptpad/pull/1305) + - Page breaks are no longer visible in conditional sections when condition is not met [#1305](https://github.com/cryptpad/cryptpad/pull/1305) + - Final submission page now has margins [#1305](https://github.com/cryptpad/cryptpad/pull/1305) + - Question blocks on mobile are now only draggable at the top of the block to make scrolling possible [#1305](https://github.com/cryptpad/cryptpad/pull/1305) +- Whiteboard + - Fix a few export-related issues [#1328](https://github.com/cryptpad/cryptpad/pull/1328) +- Calendar + - Reformat `www/calendar/export.js` [#1314](https://github.com/cryptpad/cryptpad/pull/1314) + - Fix a bug with stopping the recurrence of a calendar event [#1312](https://github.com/cryptpad/cryptpad/pull/1312) + - Calendar creates itself twice when navigating with the keyboard [#1250](https://github.com/cryptpad/cryptpad/issues/1250) + - Fix timezone in Daylight Saving Time issues [#1317](https://github.com/cryptpad/cryptpad/pull/1317) +- Translations + - Revise the translation of `zh` [#1329](https://github.com/cryptpad/cryptpad/pull/1329) + +## Dependencies +- Added [Moment.js](http://momentjs.com/) for improved handling of dates in Calendar (added as part of [#1317](https://github.com/cryptpad/cryptpad/pull/1317)) + +## Deployment +We [fixed an issue with the Systemd service file and logging](https://github.com/cryptpad/cryptpad/commit/078095c3e25d39707bdaab7ec066ceed6cb7158b), you'll need to add the following lines to your `cryptpad.service` before continuing by following the upgrade notes below. + +```diff +# Restart service after 10 seconds if node service crashes +RestartSec=2 + ++ # Proper logging to journald ++ StandardOutput=journal ++ StandardError=journal+console + +User=cryptpad +Group=cryptpad +``` + +## Upgrade notes + +If you are upgrading from a version older than `5.5.0` please read the upgrade notes of all versions between yours and `5.5.0` to avoid configuration issues. + +To upgrade: + +1. Reload the Systemd daemon, required due to the changes in the **Deployment** section +```bash +sudo systemctl daemon-reload +``` + +2. Stop your server +3. Get the latest code with git +```bash +git fetch origin --tags +git checkout 5.6.0 +``` + +4. Restart your server +5. Review your instance's checkup page to ensure that you are passing all tests + + + # 5.5.0 ## Features From bfc03ddfae665893e414af79160bf4a512f0cd0e Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 20 Dec 2023 16:40:48 +0100 Subject: [PATCH 42/72] Fix lint translation script --- scripts/translations/lint-translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/translations/lint-translations.js b/scripts/translations/lint-translations.js index f57bc14de..7a9d385ac 100644 --- a/scripts/translations/lint-translations.js +++ b/scripts/translations/lint-translations.js @@ -53,7 +53,7 @@ special_rules.fr = function (s) { ignore instances where the following character is a '/' because this is probably a URL (http(s)://) */ - return /\S[:;\?\!][^\/]{1,}/.test(s); + return /\S[:;\?\!][^\/]{1,}/.test(s.replace(/mailto:/g, " :")); }; var noop = function () {}; From adef679b4bc2e4fa93814931e758f10ff0851909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathilde=20Gr=C3=BCnig?= <41020854+mthld@users.noreply.github.com> Date: Wed, 20 Dec 2023 18:13:19 +0100 Subject: [PATCH 43/72] update Dockerfile to match new configuration example --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cd8397bfd..745dd472f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ WORKDIR /cryptpad # Copy CryptPad source code to the container COPY . /cryptpad -RUN sed -i "s@//httpAddress: '::'@httpAddress: '0.0.0.0'@" /cryptpad/config/config.example.js +RUN sed -i "s@//httpAddress: 'localhost'@httpAddress: '0.0.0.0'@" /cryptpad/config/config.example.js RUN sed -i "s@installMethod: 'unspecified'@installMethod: 'docker'@" /cryptpad/config/config.example.js # Install wget for healthcheck From c79e8765e92ff247e987319c3161b0903ab8d924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathilde=20Gr=C3=BCnig?= <41020854+mthld@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:54:50 +0100 Subject: [PATCH 44/72] add 5.6.0 as a default version in bug template, removed very old 4.x stuff --- .github/ISSUE_TEMPLATE/bug_resolution.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_resolution.yml b/.github/ISSUE_TEMPLATE/bug_resolution.yml index 9e8efa655..a7dcf2d13 100644 --- a/.github/ISSUE_TEMPLATE/bug_resolution.yml +++ b/.github/ISSUE_TEMPLATE/bug_resolution.yml @@ -89,6 +89,7 @@ body: label: Version description: What version of CryptPad are you running? options: + - 5.6.0 - 5.5.0 - 5.4.1 - 5.4.0 @@ -99,11 +100,6 @@ body: - 5.0.0 - 4.14.1 - 4.14.0 - - 4.13.0 - - 4.12.1 - - 4.12.0 - - 4.11.0 - - 4.10.0 - Other validations: required: true From 194c6fc14dd0937fdda0ad5ff24f0262f24a4b0a Mon Sep 17 00:00:00 2001 From: Guillaume Kulakowski Date: Fri, 22 Dec 2023 15:28:54 +0100 Subject: [PATCH 45/72] Fix #1349 Fix issue in PR #1287 --- Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 745dd472f..36e92e747 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,12 +14,7 @@ COPY . /cryptpad RUN sed -i "s@//httpAddress: 'localhost'@httpAddress: '0.0.0.0'@" /cryptpad/config/config.example.js RUN sed -i "s@installMethod: 'unspecified'@installMethod: 'docker'@" /cryptpad/config/config.example.js - -# Install wget for healthcheck -RUN apt-get update && apt-get install --no-install-recommends -y wget && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - + # Install dependencies RUN npm install --production \ && npm run install:components @@ -31,6 +26,11 @@ FROM node:lts-slim RUN groupadd cryptpad -g 4001 RUN useradd cryptpad -u 4001 -g 4001 -d /cryptpad +# Install wget for healthcheck +RUN apt-get update && apt-get install --no-install-recommends -y wget && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + # Copy cryptpad with installed modules COPY --from=build --chown=cryptpad /cryptpad /cryptpad USER cryptpad From 21cae4b4651a8e03749b22a9d01820445366db93 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Wed, 27 Dec 2023 12:59:30 +0100 Subject: [PATCH 46/72] date question datepicker/input field now displays correctly #1356 --- www/form/inner.js | 1 + 1 file changed, 1 insertion(+) diff --git a/www/form/inner.js b/www/form/inner.js index 5cd9e1449..2316b992a 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -2065,6 +2065,7 @@ define([ var tag = h('input'); var picker = Flatpickr(tag, { + disableMobile: true, enableTime: true, time_24hr: is24h, dateFormat: dateFormat, From beac74bd4021a8706e45c8a7eca139428e31345a Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Wed, 27 Dec 2023 16:14:21 +0100 Subject: [PATCH 47/72] fixes issue with duplicating choice/checkbox grid questions ##1348 --- www/form/inner.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/www/form/inner.js b/www/form/inner.js index 5cd9e1449..406855285 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -3295,7 +3295,7 @@ define([ }); sorted.forEach(function (uid) { var answer = answers[uid]; - + var viewOnly = content.answers.cantEdit || APP.isClosed; var action = h(viewOnly ? 'button.btn.btn-secondary' : 'button.btn.btn-primary', [ @@ -4108,10 +4108,25 @@ define([ arr = obj.arr; idx = obj.idx; _uid = Util.uid(); + + var opts = type === 'multiradio' || type === 'multicheck' ? { + items: [...Array(content.form[uid].opts.items.length).keys()].map(function (i) { + return { + uid: Util.uid(), + v: content.form[uid].opts.items[i].v + }; + }), + values: [...Array(content.form[uid].opts.values.length).keys()].map(function (i) { + return { + uid: Util.uid(), + v: content.form[uid].opts.values[i].v + }; + }) + } : content.form[uid].opts content.form[_uid] = { q: content.form[uid].q, - opts: content.form[uid].opts, + opts: opts, type: type, }; From 7c10646b9a4b3e4e32fa44a848e3aabdf1784037 Mon Sep 17 00:00:00 2001 From: Mathilde <41020854+mthld@users.noreply.github.com> Date: Thu, 28 Dec 2023 12:24:37 +0100 Subject: [PATCH 48/72] Update readme.md - Added "Privacy /" to the Security header section - Updated the sales email address --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 571fd5948..cb429c8a1 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ You can find `Dockerfile`, `docker-compose.yml` and `docker-entrypoint.sh` files Previously, Docker images were community maintained, had their own repository and weren't official supported. We changed that with v5.4.0 during July 2023. Thanks to @promasu for all the work on the community images. -# Security +# Privacy / Security CryptPad offers a variety of collaborative tools that encrypt your data in your browser before it is sent to the server and your collaborators. In the event that the server is @@ -95,7 +95,7 @@ This project is tested with [BrowserStack](https://www.browserstack.com/). This software is and will always be available under the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. If you wish to use this technology in a proprietary product, please contact -sales@xwiki.com. +sales@xcryptpad.org [Tor browser]: https://www.torproject.org/download/ [active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attack From 802571e73d445ad949bca299431c609fe6084841 Mon Sep 17 00:00:00 2001 From: Mathilde <41020854+mthld@users.noreply.github.com> Date: Thu, 28 Dec 2023 12:25:06 +0100 Subject: [PATCH 49/72] Update readme.md - Fixed a typo in the sales email address --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index cb429c8a1..e290cbb82 100644 --- a/readme.md +++ b/readme.md @@ -95,7 +95,7 @@ This project is tested with [BrowserStack](https://www.browserstack.com/). This software is and will always be available under the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. If you wish to use this technology in a proprietary product, please contact -sales@xcryptpad.org +sales@cryptpad.org [Tor browser]: https://www.torproject.org/download/ [active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attack From 52c766a599b370daa75205ebe88dd3c491773d2e Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Thu, 28 Dec 2023 12:32:15 +0100 Subject: [PATCH 50/72] kanban exports now exclude deleted items #1325 --- www/kanban/inner.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www/kanban/inner.js b/www/kanban/inner.js index 302b099dd..5c787e813 100644 --- a/www/kanban/inner.js +++ b/www/kanban/inner.js @@ -415,6 +415,10 @@ define([ var list = boards.list || []; var idx = list.indexOf(id); if (idx !== -1) { list.splice(idx, 1); } + var items = boards.data[id].item + items.forEach(function(item) { + delete boards.items[item] + }) delete (boards.data || {})[id]; kanban.removeBoard(id); return void commit(); From ed30ddc6047f007aca2f588585fe67416f1e1803 Mon Sep 17 00:00:00 2001 From: Mathilde <41020854+mthld@users.noreply.github.com> Date: Fri, 29 Dec 2023 09:48:30 +0100 Subject: [PATCH 51/72] Update CODE_OF_CONDUCT.md Update outdated contact email address --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 3889dbaf6..90001563f 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -61,7 +61,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at contact@cryptpad.fr. All +reported by contacting the project team at contact@cryptpad.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. From 7af5ff8f0681536540bba829a0ce5bcd3ff41588 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Wed, 3 Jan 2024 13:44:38 +0100 Subject: [PATCH 52/72] added range array to utils + linting --- www/common/common-util.js | 5 +++++ www/form/inner.js | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/www/common/common-util.js b/www/common/common-util.js index e5471c1ff..22509c617 100644 --- a/www/common/common-util.js +++ b/www/common/common-util.js @@ -733,6 +733,11 @@ return !(typeof(Atomics) === "undefined" || !supportsSharedArrayBuffers() || typeof(WebAssembly) === 'undefined'); }; + //Returns an array of integers in range 0 to (length-1) + Util.getKeysArray = function (length) { + return [...Array(length).keys()]; + }; + if (typeof(module) !== 'undefined' && module.exports) { module.exports = Util; } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { diff --git a/www/form/inner.js b/www/form/inner.js index 406855285..2c539971b 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -4109,20 +4109,22 @@ define([ idx = obj.idx; _uid = Util.uid(); + var itemKeys = Util.getKeysArray(content.form[uid].opts.items.length); + var valueKeys = Util.getKeysArray(content.form[uid].opts.values.length); var opts = type === 'multiradio' || type === 'multicheck' ? { - items: [...Array(content.form[uid].opts.items.length).keys()].map(function (i) { + items: itemKeys.map(function (i) { return { uid: Util.uid(), v: content.form[uid].opts.items[i].v }; }), - values: [...Array(content.form[uid].opts.values.length).keys()].map(function (i) { + values: valueKeys.map(function (i) { return { uid: Util.uid(), v: content.form[uid].opts.values[i].v }; }) - } : content.form[uid].opts + } : content.form[uid].opts; content.form[_uid] = { q: content.form[uid].q, From 13ccab973611313baf0db8c581d6215bc5a13a2e Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Wed, 3 Jan 2024 15:32:18 +0100 Subject: [PATCH 53/72] ensured items are not present in export when deleted by drag method --- www/kanban/inner.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/www/kanban/inner.js b/www/kanban/inner.js index 5c787e813..5eecc9915 100644 --- a/www/kanban/inner.js +++ b/www/kanban/inner.js @@ -415,10 +415,6 @@ define([ var list = boards.list || []; var idx = list.indexOf(id); if (idx !== -1) { list.splice(idx, 1); } - var items = boards.data[id].item - items.forEach(function(item) { - delete boards.items[item] - }) delete (boards.data || {})[id]; kanban.removeBoard(id); return void commit(); @@ -1154,6 +1150,8 @@ define([ }); framework.setFileExporter('.json', function () { + var content = kanban.getBoardsJSON(); + cleanData(content); return new Blob([JSON.stringify(kanban.getBoardsJSON(), 0, 2)], { type: 'application/json', }); From db77db3a0abaccba111fd2d1900a2e5f1ae45896 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Wed, 3 Jan 2024 16:09:50 +0100 Subject: [PATCH 54/72] moved cleanData() for lint compliance --- www/kanban/inner.js | 53 +++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/www/kanban/inner.js b/www/kanban/inner.js index 5eecc9915..966d5db9a 100644 --- a/www/kanban/inner.js +++ b/www/kanban/inner.js @@ -1137,6 +1137,33 @@ define([ if (framework.isReadOnly() || framework.isLocked()) { $container.addClass('cp-app-readonly'); } + + var cleanData = function (boards) { + if (typeof(boards) !== "object") { return; } + var items = boards.items || {}; + var data = boards.data || {}; + var list = boards.list || []; + + // Remove duplicate boards + list = boards.list = Util.deduplicateString(list); + + Object.keys(data).forEach(function (id) { + if (list.indexOf(Number(id)) === -1) { + list.push(Number(id)); + } + // Remove duplicate items + var b = data[id]; + b.item = Util.deduplicateString(b.item || []); + }); + Object.keys(items).forEach(function (eid) { + var exists = Object.keys(data).some(function (id) { + return (data[id].item || []).indexOf(Number(eid)) !== -1; + }); + if (!exists) { delete items[eid]; } + }); + framework.localChange(); + }; + framework.setFileImporter({accept: ['.json', 'application/json']}, function (content /*, file */) { var parsed; try { parsed = JSON.parse(content); } @@ -1293,32 +1320,6 @@ define([ }; }); - var cleanData = function (boards) { - if (typeof(boards) !== "object") { return; } - var items = boards.items || {}; - var data = boards.data || {}; - var list = boards.list || []; - - // Remove duplicate boards - list = boards.list = Util.deduplicateString(list); - - Object.keys(data).forEach(function (id) { - if (list.indexOf(Number(id)) === -1) { - list.push(Number(id)); - } - // Remove duplicate items - var b = data[id]; - b.item = Util.deduplicateString(b.item || []); - }); - Object.keys(items).forEach(function (eid) { - var exists = Object.keys(data).some(function (id) { - return (data[id].item || []).indexOf(Number(eid)) !== -1; - }); - if (!exists) { delete items[eid]; } - }); - framework.localChange(); - }; - framework.onReady(function () { $("#cp-app-kanban-content").focus(); var content = kanban.getBoardsJSON(); From 1fc39c92f9b7cef580d2668727d0cc24f9f090e0 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Jan 2024 13:07:37 +0100 Subject: [PATCH 55/72] Fix redirect to shared folder with read-only link #1238 --- www/common/proxy-manager.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index f09ac87b5..61732b765 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -586,7 +586,7 @@ define([ // 1. add the shared folder to our list of shared folders // NOTE: pushSharedFolder will encrypt the href directly in the object if needed Env.user.userObject.pushSharedFolder(folderData, waitFor(function (err, folderId) { - if (err === "EEXISTS" && folderData.href && folderId) { + if (err === "EEXISTS" && folderData.href && folderId) { // Check upgrade var parsed = Hash.parsePadUrl(folderData.href); var secret = Hash.getSecrets('drive', parsed.hash, folderData.password); SF.upgrade(secret.channel, secret); @@ -594,6 +594,10 @@ define([ waitFor.abort(); return void cb(folderId); } + if (err === "EEXISTS" && folderId) { // Exists but no upgrade, return folderId + waitFor.abort(); + return void cb(folderId); + } if (err) { waitFor.abort(); return void cb(err); From 39599dba75da3444c70778516749588eae807a30 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Fri, 5 Jan 2024 16:20:16 +0100 Subject: [PATCH 56/72] fixed bug affecting question types other than multicheck/grid --- www/form/inner.js | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/www/form/inner.js b/www/form/inner.js index 2c539971b..ef9653f56 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -4108,24 +4108,29 @@ define([ arr = obj.arr; idx = obj.idx; _uid = Util.uid(); - - var itemKeys = Util.getKeysArray(content.form[uid].opts.items.length); - var valueKeys = Util.getKeysArray(content.form[uid].opts.values.length); - var opts = type === 'multiradio' || type === 'multicheck' ? { - items: itemKeys.map(function (i) { - return { - uid: Util.uid(), - v: content.form[uid].opts.items[i].v - }; - }), - values: valueKeys.map(function (i) { - return { - uid: Util.uid(), - v: content.form[uid].opts.values[i].v - }; - }) - } : content.form[uid].opts; + var opts; + if (type === 'multiradio' || type === 'multicheck') { + var itemKeys = Util.getKeysArray(content.form[uid].opts.items.length); + var valueKeys = Util.getKeysArray(content.form[uid].opts.values.length); + opts = { + items: itemKeys.map(function (i) { + return { + uid: Util.uid(), + v: content.form[uid].opts.items[i].v + }; + }), + values: valueKeys.map(function (i) { + return { + uid: Util.uid(), + v: content.form[uid].opts.values[i].v + }; + }) + }; + } else { + opts = content.form[uid].opts; + } + content.form[_uid] = { q: content.form[uid].q, opts: opts, From f0591280b94f4af5f2ffc15752b16f99c8ba24d8 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Fri, 5 Jan 2024 16:44:51 +0100 Subject: [PATCH 57/72] fixed bug with duplication of 'required' status --- www/form/inner.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/www/form/inner.js b/www/form/inner.js index ef9653f56..d024e1805 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -4109,26 +4109,22 @@ define([ idx = obj.idx; _uid = Util.uid(); - var opts; + var opts = content.form[uid].opts; if (type === 'multiradio' || type === 'multicheck') { var itemKeys = Util.getKeysArray(content.form[uid].opts.items.length); var valueKeys = Util.getKeysArray(content.form[uid].opts.values.length); - opts = { - items: itemKeys.map(function (i) { + opts.items = itemKeys.map(function (i) { return { uid: Util.uid(), v: content.form[uid].opts.items[i].v }; - }), - values: valueKeys.map(function (i) { + }); + opts.values = valueKeys.map(function (i) { return { uid: Util.uid(), v: content.form[uid].opts.values[i].v }; - }) - }; - } else { - opts = content.form[uid].opts; + }); } content.form[_uid] = { From 69ea1d5b6368b94eb3e2acc775cb6da07a1610aa Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Fri, 5 Jan 2024 16:55:22 +0100 Subject: [PATCH 58/72] cloning original question instead of altering directly --- www/form/inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/form/inner.js b/www/form/inner.js index d024e1805..c1177f10a 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -4109,7 +4109,7 @@ define([ idx = obj.idx; _uid = Util.uid(); - var opts = content.form[uid].opts; + var opts = Util.clone(content.form[uid].opts); if (type === 'multiradio' || type === 'multicheck') { var itemKeys = Util.getKeysArray(content.form[uid].opts.items.length); var valueKeys = Util.getKeysArray(content.form[uid].opts.values.length); From 31b9bbf7965a350b506324d2b5820cc3f53cab27 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Jan 2024 17:40:20 +0100 Subject: [PATCH 59/72] Support activity and placeholder in eviction script --- lib/storage/blob.js | 61 +++++++++++++++++++++++++++++++++++---- scripts/clean-activity.js | 21 ++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 scripts/clean-activity.js diff --git a/lib/storage/blob.js b/lib/storage/blob.js index 97fc8b9e3..172af2e1a 100644 --- a/lib/storage/blob.js +++ b/lib/storage/blob.js @@ -464,7 +464,7 @@ var makeWalker = function (n, handleChild, done) { // do no more than 20 jobs at a time var tasks = Semaphore.create(n); - var recurse = function (path) { + var recurse = function (path, dir) { tasks.take(function (give) { var next = give(W()); @@ -477,7 +477,19 @@ var makeWalker = function (n, handleChild, done) { } if (!stats.isDirectory()) { w.abort(); - return void handleChild(void 0, path, next); + if (/\.activity$/.test(path)) { + // NOTE: some activity files were created for deleted blobs due to + // a bug. We're going to detect them here in order to be able to clean + // them. + if (!dir.includes(Path.basename(path.replace(/\.activity$/, '')))) { + return void handleChild(void 0, path, next, true); + } + // Ignore valid activity files + return next(); + } + // Ignore placeholder files + if (/\.placeholder$/.test(path)) { return next(); } + return void handleChild(void 0, path, next, false); } // fall through })); @@ -487,7 +499,7 @@ var makeWalker = function (n, handleChild, done) { if (err) { return next(); } // everything is fine and it's a directory... dir.forEach(function (d) { - recurse(Path.join(path, d)); + recurse(Path.join(path, d), dir); }); next(); }); @@ -502,7 +514,8 @@ var listProofs = function (root, handler, cb) { Fs.readdir(root, function (err, dir) { if (err) { return void cb(err); } - var walk = makeWalker(20, function (err, path, next) { + var walk = makeWalker(20, function (err, path, next, loneActivity) { + if (loneActivity) { return void next(); } // path is the path to a child node on the filesystem // next handles the next job in a queue @@ -537,12 +550,20 @@ var listProofs = function (root, handler, cb) { }); }; +var getActivityStat = function (path, base, cb) { + var suffix = base ? '' : '.activity'; + Fs.stat(path+suffix, function (err, stats) { + if (err && err.code === 'ENOENT' && !base) { return getActivityStat(path, true, cb); } + cb(err, stats); + }); +}; var listBlobs = function (root, handler, cb) { // iterate over files Fs.readdir(root, function (err, dir) { if (err) { return void cb(err); } - var walk = makeWalker(20, function (err, path, next) { - Fs.stat(path, function (err, stats) { + var walk = makeWalker(20, function (err, path, next, loneActivity) { + if (loneActivity) { return void next(); } + getActivityStat(path, false, function (err, stats) { if (err) { return void handler(err, void 0, next); } @@ -565,6 +586,30 @@ var listBlobs = function (root, handler, cb) { }); }; +var cleanLoneActivity = function (root, cb) { + // iterate over files + Fs.readdir(root, function (err, dir) { + if (err) { return void cb(err); } + var walk = makeWalker(20, function (err, path, next, loneActivity) { + if (!loneActivity) { return void next(); } + Fs.unlink(path, function (err) { + if (err) { + return console.error('ERROR', path, err); + } + console.log('DELETED', path); + next(); + }); + }, function () { + cb(); + }); + + dir.forEach(function (d) { + if (d.length !== 2) { return; } + walk(Path.join(root, d)); + }); + }); +}; + BlobStore.create = function (config, _cb) { var cb = Util.once(Util.mkAsync(_cb)); if (typeof(config.getSession) !== 'function') { @@ -651,6 +696,10 @@ BlobStore.create = function (config, _cb) { removeArchivedProof(Env, safeKey, blobId, cb); }, }, + loneActivity: function (_cb) { + var cb = Util.once(Util.mkAsync(_cb)); + cleanLoneActivity(Env.blobPath, cb); + } }, archive: { diff --git a/scripts/clean-activity.js b/scripts/clean-activity.js new file mode 100644 index 000000000..6cb3f75f6 --- /dev/null +++ b/scripts/clean-activity.js @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +/** + * Some .activity file were created for deleted blob due to a bug. + * This script can be run once to remove these invalid activity file. +**/ +var nThen = require("nthen"); +var config = require("../lib/load-config"); +var BlobStore = require("../lib/storage/blob"); + +config.getSession = function () {}; +BlobStore.create(config, function (err, store) { + if (err) { return console.error('ERROR', err); } + console.log('Cleaning lone .activity files...'); + store.remove.loneActivity(function (err) { + if (err) { return console.error('ERROR', err); } + console.log('Done'); + }); +}); From 0e918643ce839ee86b6fdd94f2f7e6866c44fa91 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Jan 2024 17:46:04 +0100 Subject: [PATCH 60/72] Check if a blob exists before creating the activity file --- lib/storage/blob.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/storage/blob.js b/lib/storage/blob.js index 172af2e1a..b029b95c5 100644 --- a/lib/storage/blob.js +++ b/lib/storage/blob.js @@ -153,8 +153,12 @@ var clearActivity = function (Env, blobId, cb) { }; var updateActivity = function (Env, blobId, cb) { var path = makeActivityPath(Env, blobId); - var s_data = String(+new Date()); - Fs.writeFile(path, s_data, cb); + var blobPath = makeBlobPath(Env, blobId); + isFile(blobPath, (err, state) => { + if (err || !state) { return void cb(); } + var s_data = String(+new Date()); + Fs.writeFile(path, s_data, cb); + }); }; var archiveActivity = function (Env, blobId, cb) { From 70d47193596662b2ee7278d6671b56812f11f821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathilde=20Gr=C3=BCnig?= <41020854+mthld@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:01:01 +0100 Subject: [PATCH 61/72] fix typo in issue template --- .github/ISSUE_TEMPLATE/bug_resolution.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_resolution.yml b/.github/ISSUE_TEMPLATE/bug_resolution.yml index a7dcf2d13..cdd7418f0 100644 --- a/.github/ISSUE_TEMPLATE/bug_resolution.yml +++ b/.github/ISSUE_TEMPLATE/bug_resolution.yml @@ -55,7 +55,7 @@ body: - type: dropdown id: operating-system attributes: - label: What opreating system are you using? + label: Which operating system are you using? multiple: true options: - Linux/BSD/UNIX From 70d84838dfa53369825637eb1ba7759e169f02e7 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Jan 2024 14:08:26 +0100 Subject: [PATCH 62/72] Add DRY_RUN option to the eviction script --- lib/eviction.js | 39 +++++++++++++++++++++++++++++++++++++-- scripts/evict-inactive.js | 4 ++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lib/eviction.js b/lib/eviction.js index 8bd530f1e..42afbc2c5 100644 --- a/lib/eviction.js +++ b/lib/eviction.js @@ -200,6 +200,11 @@ var evictArchived = function (Env, cb) { // but if it's been stored for the configured time... // expire it + if (Env.DRY_RUN) { + if (item.channel.length === 32) { removed++; } + else if (item.channel.length === 44) { accounts++; } + return void Log.info("EVICT_ARCHIVED_CHANNEL_DRY_RUN", item.channel, next); + } store.removeArchivedChannel(item.channel, w(function (err) { if (err) { return Log.error('EVICT_ARCHIVED_CHANNEL_REMOVAL_ERROR', { @@ -246,6 +251,10 @@ var evictArchived = function (Env, cb) { return void next(); } if (item && item.mtime > retentionTime) { return void next(); } + if (Env.DRY_RUN) { + removed++; + return void Log.info("EVICT_ARCHIVED_BLOB_PROOF_DRY_RUN", item, next); + } blobs.remove.archived.proof(item.safeKey, item.blobId, (function (err) { if (err) { Log.error("EVICT_ARCHIVED_BLOB_PROOF_ERROR", item); @@ -273,6 +282,10 @@ var evictArchived = function (Env, cb) { return void next(); } if (item && item.mtime > retentionTime) { return void next(); } + if (Env.DRY_RUN) { + removed++; + return void Log.info("EVICT_ARCHIVED_BLOB_DRY_RUN", item, next); + } blobs.remove.archived.blob(item.blobId, function (err) { if (err) { Log.error("EVICT_ARCHIVED_BLOB_ERROR", item); @@ -288,6 +301,7 @@ var evictArchived = function (Env, cb) { })); }; + if (Env.DRY_RUN) { Env.Log.info('DRY RUN'); } nThen(loadStorage) .nThen(migrateIncorrectBlobs) .nThen(removeArchivedChannels) @@ -544,6 +558,9 @@ module.exports = function (Env, cb) { } // remove the pin logs of inactive accounts if inactive account removal is configured + if (Env.DRY_RUN) { + return void Log.info("EVICT_INACTIVE_ACCOUNT_DRY_RUN", id, cb); + } pinStore.archiveChannel(id, undefined, function (err) { if (err) { return Log.error('EVICT_INACTIVE_ACCOUNT_PIN_LOG', err, next); @@ -602,7 +619,12 @@ module.exports = function (Env, cb) { // unless we address this race condition with this last-minute double-check if (item.mtime > inactiveTime) { return void next(); } - removed++; + if (Env.DRY_RUN) { + removed++; + return void Log.info("EVICT_ARCHIVE_BLOB_DRY_RUN", { + item: item, + }, next); + } blobs.archive.blob(item.blobId, 'INACTIVE', function (err) { if (err) { return Log.error("EVICT_ARCHIVE_BLOB_ERROR", { @@ -610,6 +632,7 @@ module.exports = function (Env, cb) { item: item, }, next); } + removed++; Log.info("EVICT_ARCHIVE_BLOB", { item: item, }, next); @@ -658,6 +681,10 @@ module.exports = function (Env, cb) { } })); }).nThen(function () { + if (Env.DRY_RUN) { + removed++; + return void Log.info("EVICT_BLOB_PROOF_LONELY_DRY_RUN", item, next); + } blobs.remove.proof(item.safeKey, item.blobId, function (err) { if (err) { return Log.error("EVICT_BLOB_PROOF_LONELY_ERROR", item, next); @@ -698,6 +725,9 @@ module.exports = function (Env, cb) { // check if the database has any ephemeral channels // if it does it's because of a bug, and they should be removed if (item.channel.length === 34) { + if (Env.DRY_RUN) { + return void Log.info("EVICT_EPHEMERAL_DRY_RUN", item.channel, cb); + } return void store.removeChannel(item.channel, w(function (err) { if (err) { return Log.error('EVICT_EPHEMERAL_CHANNEL_REMOVAL_ERROR', { @@ -728,6 +758,10 @@ module.exports = function (Env, cb) { // else fall through to the archival })); }).nThen(function (w) { + if (Env.DRY_RUN) { + archived++; + return void Log.info("EVICT_CHANNEL_ARCHIVAL_DRY_RUN", item.channel, cb); + } return void store.archiveChannel(item.channel, 'INACTIVE', w(function (err) { if (err) { Log.error('EVICT_CHANNEL_ARCHIVAL_ERROR', { @@ -736,8 +770,8 @@ module.exports = function (Env, cb) { }, w()); return; } - Log.info('EVICT_CHANNEL_ARCHIVAL', item.channel, w()); archived++; + Log.info('EVICT_CHANNEL_ARCHIVAL', item.channel, w()); })); }).nThen(cb); }; @@ -754,6 +788,7 @@ module.exports = function (Env, cb) { store.listChannels(handler, w(done), true); // using a hacky "fast mode" since we only need the channel id }; + if (Env.DRY_RUN) { Env.Log.info('DRY RUN'); } nThen(loadStorage) // iterate over all documents and add them to a bloom filter if they have been active diff --git a/scripts/evict-inactive.js b/scripts/evict-inactive.js index f53536ae3..521edf015 100644 --- a/scripts/evict-inactive.js +++ b/scripts/evict-inactive.js @@ -15,6 +15,10 @@ var config = require("../lib/load-config"); var Env = Environment.create(config); +// Set DRY_RUN to true to run the script without deleting anything. A log file +// will be created. +Env.DRY_RUN = false; + var loadPremiumAccounts = function (Env, cb) { nThen(function (w) { // load premium accounts From b22441446c829aec5613cbd1788d57e6fd952b40 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Jan 2024 14:12:04 +0100 Subject: [PATCH 63/72] Fix eviction error and add DRY_RUN to the archive cleaning script --- lib/eviction.js | 2 +- scripts/evict-archived.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/eviction.js b/lib/eviction.js index 42afbc2c5..12aaeff0f 100644 --- a/lib/eviction.js +++ b/lib/eviction.js @@ -203,7 +203,7 @@ var evictArchived = function (Env, cb) { if (Env.DRY_RUN) { if (item.channel.length === 32) { removed++; } else if (item.channel.length === 44) { accounts++; } - return void Log.info("EVICT_ARCHIVED_CHANNEL_DRY_RUN", item.channel, next); + return void Log.info("EVICT_ARCHIVED_CHANNEL_DRY_RUN", item.channel, cb); } store.removeArchivedChannel(item.channel, w(function (err) { if (err) { diff --git a/scripts/evict-archived.js b/scripts/evict-archived.js index 124ebc30c..6914c90ad 100644 --- a/scripts/evict-archived.js +++ b/scripts/evict-archived.js @@ -15,6 +15,10 @@ var config = require("../lib/load-config"); var Env = Environment.create(config); +// Set DRY_RUN to true to run the script without deleting anything. A log file +// will be created. +Env.DRY_RUN = false; + var loadPremiumAccounts = function (Env, cb) { nThen(function (w) { // load premium accounts From 467e8ee7fe29df86072c757e5e867abb26afa710 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Jan 2024 14:41:00 +0100 Subject: [PATCH 64/72] Use ctime to detect deletable archived blobs --- lib/eviction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/eviction.js b/lib/eviction.js index 12aaeff0f..dd0d777ab 100644 --- a/lib/eviction.js +++ b/lib/eviction.js @@ -250,7 +250,7 @@ var evictArchived = function (Env, cb) { Log.error("EVICT_BLOB_LIST_ARCHIVED_PROOF_ERROR", err); return void next(); } - if (item && item.mtime > retentionTime) { return void next(); } + if (item && item.ctime > retentionTime) { return void next(); } if (Env.DRY_RUN) { removed++; return void Log.info("EVICT_ARCHIVED_BLOB_PROOF_DRY_RUN", item, next); @@ -281,7 +281,7 @@ var evictArchived = function (Env, cb) { Log.error("EVICT_BLOB_LIST_ARCHIVED_BLOBS_ERROR", err); return void next(); } - if (item && item.mtime > retentionTime) { return void next(); } + if (item && item.ctime > retentionTime) { return void next(); } if (Env.DRY_RUN) { removed++; return void Log.info("EVICT_ARCHIVED_BLOB_DRY_RUN", item, next); From 20df2a4d536ab93f9f0fac59eba547ace071aac2 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Jan 2024 15:45:43 +0100 Subject: [PATCH 65/72] Fix TypeError when destroying a shared folder --- www/common/inner/access.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/inner/access.js b/www/common/inner/access.js index d1cfda31f..acaee6723 100644 --- a/www/common/inner/access.js +++ b/www/common/inner/access.js @@ -1028,7 +1028,7 @@ define([ // If this is a form wiht a answer channel, delete it too var p = priv.propChannels; - if (p.answersChannel) { + if (p && p.answersChannel) { sframeChan.query('Q_DELETE_OWNED', { teamId: typeof(owned) !== "boolean" ? owned : undefined, channel: p.answersChannel From ff3a40aa3152d5e09a70d3afb02356e4ba516631 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Jan 2024 19:11:20 +0100 Subject: [PATCH 66/72] Fix TypeError --- lib/eviction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eviction.js b/lib/eviction.js index dd0d777ab..4cac76e71 100644 --- a/lib/eviction.js +++ b/lib/eviction.js @@ -559,7 +559,7 @@ module.exports = function (Env, cb) { // remove the pin logs of inactive accounts if inactive account removal is configured if (Env.DRY_RUN) { - return void Log.info("EVICT_INACTIVE_ACCOUNT_DRY_RUN", id, cb); + return void Log.info("EVICT_INACTIVE_ACCOUNT_DRY_RUN", id, next); } pinStore.archiveChannel(id, undefined, function (err) { if (err) { From d92636bcf8920fb6c81a9d1f23f0d4143f6cc513 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 9 Jan 2024 15:09:41 +0100 Subject: [PATCH 67/72] Fix DRY_RUN issue --- lib/eviction.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/eviction.js b/lib/eviction.js index 4cac76e71..e57041ffb 100644 --- a/lib/eviction.js +++ b/lib/eviction.js @@ -760,6 +760,7 @@ module.exports = function (Env, cb) { }).nThen(function (w) { if (Env.DRY_RUN) { archived++; + w.abort(); return void Log.info("EVICT_CHANNEL_ARCHIVAL_DRY_RUN", item.channel, cb); } return void store.archiveChannel(item.channel, 'INACTIVE', w(function (err) { From 2d2046c16082634290173c466951b668a63b613d Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 10 Jan 2024 15:39:59 +0100 Subject: [PATCH 68/72] Prevent 'empty trash' button to overload async store thread #1344 --- www/common/outer/async-store.js | 3 +- www/common/proxy-manager.js | 51 ++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 99cf943c9..33052fe5d 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -1403,7 +1403,7 @@ define([ // Hidden hash: if a pad is deleted, we may have to switch back to full hash // in some tabs - Store.checkDeletedPad = function (channel) { + Store.checkDeletedPad = function (channel, cb) { if (!channel) { return; } // Check if the pad is still stored in one of our drives @@ -1411,6 +1411,7 @@ define([ channel: channel, isFile: true // we don't care if it's view or edit }, function (res) { + if (typeof(cb) === "function") { setTimeout(cb); } // If it is stored, abort if (Object.keys(res).length) { return; } // Otherwise, tell all the tabs that this channel was deleted and give them the hrefs diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index 61732b765..509e91a3a 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -1019,41 +1019,52 @@ define([ var owned = Env.user.userObject.ownedInTrash(function (owners) { return _ownedByMe(Env, owners); }); + var n = nThen; owned.forEach(function (chan) { - Env.removeOwnedChannel(chan, waitFor(function (obj) { - // If the error is that the file is already removed, nothing to - // report, it's a normal behavior (pad expired probably) - if (obj && obj.error && obj.error !== "ENOENT") { - // RPC may not be responding - // Send a report that can be handled manually - console.error(obj.error, chan); - Feedback.send('ERROR_EMPTYTRASH_OWNED=' + chan + '|' + obj.error, true); - } - console.warn('DELETED', chan); - })); + n = n(function (w) { + Env.removeOwnedChannel(chan, w(function (obj) { + setTimeout(w(), 50); + // If the error is that the file is already removed, nothing to + // report, it's a normal behavior (pad expired probably) + if (obj && obj.error && obj.error !== "ENOENT") { + // RPC may not be responding + // Send a report that can be handled manually + console.error(obj.error, chan); + Feedback.send('ERROR_EMPTYTRASH_OWNED=' + chan + '|' + obj.error, true); + } + console.warn('DELETED', chan); + })); + }).nThen; }); + n(waitFor()); } // Empty the trash Env.user.userObject.emptyTrash(waitFor(function (err, toClean) { - cb(); - + var nn = nThen; // Don't block nThen for the lower-priority tasks - setTimeout(function () { + setTimeout(waitFor(function () { // Unpin deleted pads if needed // Check if we need to restore a full hash (hidden hash deleted from drive) if (!Array.isArray(toClean)) { return; } + var done = waitFor(); var toCheck = Util.deduplicateString(toClean); var toUnpin = []; toCheck.forEach(function (channel) { // Check unpin - var data = findChannel(Env, channel, true); - if (!data.length) { toUnpin.push(channel); } - // Check hidden hash - Env.Store.checkDeletedPad(channel); + nn = nn(function (w) { + var data = findChannel(Env, channel, true); + if (!data.length) { toUnpin.push(channel); } + // Check hidden hash, one at a time, asynchronously + Env.Store.checkDeletedPad(channel, w()); + }).nThen; }); - Env.unpinPads(toUnpin, function () {}); - }); + nn(function () { + Env.unpinPads(toUnpin, function () { + done(); + }); + }); + })); })); }).nThen(cb); }; From af25c8f4b7c7cd1aefdaeb66d0566e37ca85800d Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 10 Jan 2024 16:24:09 +0100 Subject: [PATCH 69/72] Fix read-only shared folders issue #1377 --- www/common/drive-ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 6bd2699bf..b1803a7d3 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -636,7 +636,7 @@ define([ // UI containers var $tree = APP.$tree = $("#cp-app-drive-tree"); var $content = APP.$content = $("#cp-app-drive-content"); - var $contentContainer = APP.$content = $("#cp-app-drive-content-container"); + var $contentContainer = $("#cp-app-drive-content-container"); var $appContainer = $(".cp-app-drive-container"); var $driveToolbar = APP.toolbar.$bottom; var $contextMenu = createContextMenu(common).appendTo($appContainer); From c5523d4c5ef1621383d74d6f59d85ec67243c206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 02:02:09 +0000 Subject: [PATCH 70/72] Bump follow-redirects from 1.15.3 to 1.15.4 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.4. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.4) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34e3156bd..2476d1545 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2028,9 +2028,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", From a852654b4585e3201892bd53e0136d42834a4b34 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 15 Jan 2024 15:59:51 +0100 Subject: [PATCH 71/72] Fix thumbnail not working anymore --- www/common/common-thumbnail.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/www/common/common-thumbnail.js b/www/common/common-thumbnail.js index 2298a904a..7dcf55455 100644 --- a/www/common/common-thumbnail.js +++ b/www/common/common-thumbnail.js @@ -230,17 +230,17 @@ define([ Thumb.fromDOM = function (opts, cb) { var element = opts.getContainer(); if (!element) { return; } - var todo = function () { + var todo = function (html2canvas) { + if (!window.html2canvas) { window.html2canvas = html2canvas; } if (opts.filter) { opts.filter(element, true); } window.html2canvas(element, { allowTaint: true, - onrendered: function (canvas) { - if (opts.filter) { opts.filter(element, false); } - setTimeout(function () { - var D = getResizedDimensions(canvas, 'pad'); - Thumb.fromCanvas(canvas, D, cb); - }, 10); - } + }).then(function (canvas) { + if (opts.filter) { opts.filter(element, false); } + setTimeout(function () { + var D = getResizedDimensions(canvas, 'pad'); + Thumb.fromCanvas(canvas, D, cb); + }, 10); }); }; if (window.html2canvas) { return void todo(); } From 6e132a092f324884de958b53b54fb6e2a51fe1cf Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 16 Jan 2024 16:04:33 +0100 Subject: [PATCH 72/72] lint compliance --- scripts/clean-activity.js | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/clean-activity.js b/scripts/clean-activity.js index 6cb3f75f6..dbb58c8f3 100644 --- a/scripts/clean-activity.js +++ b/scripts/clean-activity.js @@ -6,7 +6,6 @@ * Some .activity file were created for deleted blob due to a bug. * This script can be run once to remove these invalid activity file. **/ -var nThen = require("nthen"); var config = require("../lib/load-config"); var BlobStore = require("../lib/storage/blob");