Compare commits

..

No commits in common. "5c42e0481352d62384194aee31b9b61a66e3e62c" and "5cebe7ffe0a094cebc39de95d7d8708ffeba0cbe" have entirely different histories.

55 changed files with 238 additions and 497 deletions

16
debian/changelog vendored
View File

@ -1,19 +1,3 @@
freedombox (26.7.1) unstable; urgency=medium
[ Frederico Gomes ]
* radicale: Enable lc_username for case-insensitive auth
[ Sunil Mohan Adapa ]
* radicale, bepasty: Fix issue with failed diagnostic test
* radicale: Fix issue with parsing new configuration file
* radicale: tests: functional: Better checking for well-known URLs
[ James Valleroy ]
* locale: Update translation strings
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Tue, 28 Apr 2026 18:26:38 -0400
freedombox (26.7) unstable; urgency=medium
[ Burak Yavuz ]

View File

@ -8,13 +8,6 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.7.1 (2026-04-28) ==
* radicale, bepasty: Fix issue with failed diagnostic test
* radicale: Enable lc_username for case-insensitive auth
* radicale: Fix issue with parsing new configuration file
* radicale: tests: functional: Better checking for well-known URLs
== FreedomBox 26.7 (2026-04-20) ==
* debian: tests: Add test to access interface status

View File

@ -8,13 +8,6 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.7.1 (2026-04-28) ==
* radicale, bepasty: Fix issue with failed diagnostic test
* radicale: Enable lc_username for case-insensitive auth
* radicale: Fix issue with parsing new configuration file
* radicale: tests: functional: Better checking for well-known URLs
== FreedomBox 26.7 (2026-04-20) ==
* debian: tests: Add test to access interface status

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '26.7.1'
__version__ = '26.7'

View File

@ -120,6 +120,14 @@ def service_disable(service_name: str, check: bool = False):
except subprocess.CalledProcessError:
pass
if service_name.endswith('.socket'):
# Instead, may need to query the unit for associated .service file.
base_name = service_name.rpartition('.')[0]
try:
service_stop(f'{base_name}.service', check=check)
except subprocess.CalledProcessError:
pass
def service_mask(service_name: str, check: bool = False):
"""Mask a service"""
@ -135,62 +143,25 @@ def service_start(service_name: str, check: bool = False):
"""Start a service with systemd."""
service_action(service_name, 'start', check=check)
# When starting a .socket unit, there is not need to start the .service
# unit as it will be automatically started when a request is received on
# the socket.
def _get_service_unit(socket_name: str) -> str:
"""Return the .service unit name for a .socket unit."""
# Instead, may need to query the unit for associated .service file.
base_name = socket_name.rpartition('.')[0]
return f'{base_name}.service'
def service_stop(service_name: str, check: bool = False):
"""Stop a service with systemd."""
service_action(service_name, 'stop', check=check)
# When stopping a .socket unit, most of the time, we must also stop
# .service unit. This frees up resources when disabling the app. It also
# stops using resources that are being backed up.
if service_name.endswith('.socket'):
service_action(_get_service_unit(service_name), 'stop', check=check)
def service_restart(service_name: str, check: bool = False):
"""Restart a service with systemd."""
if not service_name.endswith('.socket'):
service_action(service_name, 'restart', check=check)
else:
# When restarting a .socket unit, most of the time, we actually want to
# restart the corresponding .service unit. This reloads the
# configuration changes as needed. To restart, all we need to do stop
# the service. It will be automatically started again by .socket unit.
service_action(_get_service_unit(service_name), 'stop', check=check)
service_action(service_name, 'restart', check=check)
def service_try_restart(service_name: str, check: bool = False):
"""Try to restart a service with systemd."""
if not service_name.endswith('.socket'):
service_action(service_name, 'try-restart', check=check)
else:
# When try-restarting a .socket unit, most of the time, we actually
# want to restart the corresponding .service unit. This reloads the
# configuration changes as needed. To restart, all we need to do stop
# the service. It will be automatically started again by .socket unit.
service_action(_get_service_unit(service_name), 'stop', check=check)
service_action(service_name, 'try-restart', check=check)
def service_reload(service_name: str, check: bool = False):
"""Reload a service with systemd."""
if not service_name.endswith('.socket'):
service_action(service_name, 'reload', check=check)
else:
# When reloading a .socket unit, most of the time, we actually want to
# reload the corresponding .service unit. This reloads the
# configuration changes as needed.
service_action(_get_service_unit(service_name), 'reload', check=check)
service_action(service_name, 'reload', check=check)
def service_try_reload_or_restart(service_name: str, check: bool = False):
@ -198,14 +169,7 @@ def service_try_reload_or_restart(service_name: str, check: bool = False):
Do nothing if service is not running.
"""
if not service_name.endswith('.socket'):
service_action(service_name, 'try-reload-or-restart', check=check)
else:
# When reloading a .socket unit, most of the time, we actually want to
# reload the corresponding .service unit. This reloads the
# configuration changes as needed.
service_action(_get_service_unit(service_name),
'try-reload-or-restart', check=check)
service_action(service_name, 'try-reload-or-restart', check=check)
def service_reset_failed(service_name: str, check: bool = False):

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-04-16 02:28+0000\n"
"Last-Translator: MohammedSaalif <2300031323@kluniversity.in>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/freedombox/"
@ -6386,7 +6386,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6395,14 +6395,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2020-06-10 15:41+0000\n"
"Last-Translator: aiman an <an1f3@hotmail.com>\n"
"Language-Team: Arabic (Saudi Arabia) <https://hosted.weblate.org/projects/"
@ -6390,7 +6390,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6399,14 +6399,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -6340,7 +6340,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6349,14 +6349,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-12-17 07:00+0000\n"
"Last-Translator: 109247019824 "
"<109247019824@users.noreply.hosted.weblate.org>\n"
@ -6686,7 +6686,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6695,14 +6695,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-04-01 03:02+0000\n"
"Last-Translator: MURALA SAI GANESH <saiganeshmurala@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/freedombox/"
@ -6409,7 +6409,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6418,14 +6418,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-02-06 23:02+0000\n"
"Last-Translator: kosagi <marti.torra@natana.cat>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/freedombox/"
@ -7170,7 +7170,7 @@ msgstr ""
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7179,14 +7179,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-09 10:09+0000\n"
"Last-Translator: Jiří Podhorecký <j.podhorecky@volny.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/freedombox/"
@ -7160,7 +7160,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7174,7 +7174,7 @@ msgstr ""
"klientská aplikace</a>. K Radicale má přístup každý uživatel s přihlašovacím "
"jménem {box_name}."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7184,7 +7184,7 @@ msgstr ""
"nových kalendářů a adresářů kontaktů. Nepodporuje přidávání událostí či "
"kontaktů, to je třeba dělat v tomu určeném klientovi."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/freedombox/"
@ -7365,7 +7365,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7385,14 +7385,14 @@ msgstr ""
"carddav-clients\">understøttet klient-applikation</a>. Radicale kan tilgås "
"af enhver bruger der har et log ind til {box_name}."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-09 10:09+0000\n"
"Last-Translator: Dietmar <sagen@permondes.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/freedombox/"
@ -7303,7 +7303,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7317,7 +7317,7 @@ msgstr ""
"clients\">unterstützte Client Software</a> notwendig. Radicale kann von "
"jedem Benutzer mit einem {box_name}-Konto verwendet werden."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7328,7 +7328,7 @@ msgstr ""
"Kontaktdaten wird nicht unterstützt; dies muss über einen separaten Client "
"erfolgen."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -6341,7 +6341,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6350,14 +6350,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-02-22 13:17+0000\n"
"Last-Translator: James Valleroy <jvalleroy@mailbox.org>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/freedombox/"
@ -7441,7 +7441,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7460,7 +7460,7 @@ msgstr ""
"clients/\">πελάτη</a> . Το Radicale μπορεί να προσεγγιστεί από οποιονδήποτε "
"χρήστη με {box_name} πιστοποιητικά."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7471,7 +7471,7 @@ msgstr ""
"γεγονότων ή επαφών, το οποίο πρέπει να γίνει χρησιμοποιώντας ένα ξεχωριστό "
"πελάτη."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2024-11-01 17:00+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/freedombox/"
@ -7381,7 +7381,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7401,7 +7401,7 @@ msgstr ""
"supported-clients\">aplicación cliente soportada</a>. Cualquier persona "
"autenticada en {box_name} puede acceder a Radicale."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7411,7 +7411,7 @@ msgstr ""
"de nuevos calendarios y agendas. No soporta añadir eventos o contactos, que "
"debe hacerse usando un cliente separado."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-01-09 20:01+0000\n"
"Last-Translator: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>\n"
"Language-Team: Estonian <https://hosted.weblate.org/projects/freedombox/"
@ -6384,7 +6384,7 @@ msgstr ""
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6393,14 +6393,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/freedombox/"
@ -7062,7 +7062,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7071,14 +7071,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth 0.6\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2016-01-31 22:24+0530\n"
"Last-Translator: Sunil Mohan Adapa <sunil@medhas.org>\n"
"Language-Team: Plinth Developers <freedombox-"
@ -7390,7 +7390,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7399,14 +7399,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-16 15:09+0000\n"
"Last-Translator: Coucouf <coucouf@coucouf.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/freedombox/"
@ -7326,7 +7326,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7342,7 +7342,7 @@ msgstr ""
"a>. Tous les utilisateur disposant dun compte sur la {box_name} ont accès à "
"Radicale."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7353,7 +7353,7 @@ msgstr ""
"charge lajout dévénements ou de contacts, opérations qui doivent être "
"réalisées avec un client dédié."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-12-30 10:51+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/freedombox/"
@ -6385,7 +6385,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6394,14 +6394,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2021-01-18 12:32+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Gujarati <https://hosted.weblate.org/projects/freedombox/"
@ -6776,7 +6776,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6785,14 +6785,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-03-31 06:09+0000\n"
"Last-Translator: bsurajpatra <ankitsuraj1111@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/freedombox/"
@ -7329,7 +7329,7 @@ msgstr "क्वासेलड्रोइड"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7347,14 +7347,14 @@ msgstr ""
"radicale.org/clients/\">समर्थित क्लाइंट एप्लिकेशन</a> कि जरुरत है. राडिकैल किसी "
"{box_name} यूसर पहुंचा जा सकता है एक लॉगिन के साथ."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "राडिकैल"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-06-04 15:01+0000\n"
"Last-Translator: András Szűcs "
"<andrascc86288f63c44cb5@users.noreply.hosted.weblate.org>\n"
@ -7496,7 +7496,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7517,7 +7517,7 @@ msgstr ""
"alkalmazásra</a> is. A Radicale elérhető bármely felhasználó számára a "
"{box_name} eszközön."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7527,7 +7527,7 @@ msgstr ""
"címjegyzékek létrehozását támogatja. Nem támogatja az események vagy "
"kapcsolatok hozzáadását, ezeket külön kliens segítségével kell elvégezni."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Indonesian (FreedomBox)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/freedombox/"
@ -7047,7 +7047,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7056,14 +7056,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-18 21:09+0000\n"
"Last-Translator: Pierfrancesco Passerini <p.passerini@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/freedombox/"
@ -7219,7 +7219,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7233,7 +7233,7 @@ msgstr ""
"client supportata</a>. Ogni utente con un profilo {box_name} può accedere a "
"Radicale."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7243,7 +7243,7 @@ msgstr ""
"nuovi calendari e rubriche. Non supporta l'aggiunta di eventi o contatti, "
"che dovranno essere gestiti tramite un client separato."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-10-24 16:02+0000\n"
"Last-Translator: Jun Nogata <nogajun@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/freedombox/"
@ -6348,7 +6348,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6357,14 +6357,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2020-07-16 16:41+0000\n"
"Last-Translator: Yogesh <yogesh@karnatakaeducation.org.in>\n"
"Language-Team: Kannada <https://hosted.weblate.org/projects/freedombox/"
@ -6343,7 +6343,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6352,14 +6352,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/freedombox/"
@ -6363,7 +6363,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6372,14 +6372,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:20+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Latvian <https://hosted.weblate.org/projects/freedombox/"
@ -6362,7 +6362,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6371,14 +6371,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2024-10-27 23:30+0000\n"
"Last-Translator: Sunil Mohan Adapa <sunil@medhas.org>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
@ -7433,7 +7433,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, fuzzy, python-brace-format
#| msgid ""
#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7451,7 +7451,7 @@ msgstr ""
"href=\"http://radicale.org/clients/\">støttet klientprogram </a>. Radicale "
"kan nås av alle brukere med {box_name}-innlogging."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7461,7 +7461,7 @@ msgstr ""
"kalendre og adressebøker. Den tilbyr ikke å legge inn nye hendelser eller "
"kontakter, det må gjøres med en egen klient."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-09-17 09:01+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/freedombox/"
@ -7172,7 +7172,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7186,7 +7186,7 @@ msgstr ""
"clienttoepassing</a> nodig. Radicale kan worden benaderd door elke "
"{box_name} gebruiker."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7197,7 +7197,7 @@ msgstr ""
"gebeurtenissen of contactpersonen, die moeten worden gedaan met behulp van "
"een aparte client."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2024-07-13 12:09+0000\n"
"Last-Translator: Monika <adamdomenek@protonmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/freedombox/"
@ -7012,7 +7012,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7021,14 +7021,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-04-09 22:41+0000\n"
"Last-Translator: tuliogit <wikigeolog@gmx.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/freedombox/"
@ -7266,7 +7266,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7280,7 +7280,7 @@ msgstr ""
"radicale.org/master.html#supported-clients\"&gt;&lt;/a&gt; . O Radicale pode "
"ser acessado por qualquer usuário com um login {box_name} ."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7290,7 +7290,7 @@ msgstr ""
"novos calendários e catálogos de endereços. Não permite adicionar eventos ou "
"contatos, o que deve ser feito usando um cliente separado."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radical"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-03-15 18:09+0000\n"
"Last-Translator: OwlGale <owlgale@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/freedombox/"
@ -7224,7 +7224,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7238,7 +7238,7 @@ msgstr ""
"clients\">поддерживаемое клиентское приложение</a>. Доступ к Radicale может "
"получить любой пользователь с логином {box_name}."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7248,7 +7248,7 @@ msgstr ""
"создание новых календарей и адресных книг. Он не поддерживает добавление "
"событий или контактов, для этого требуется отдельный клиент."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2021-04-27 13:32+0000\n"
"Last-Translator: HelaBasa <R45XvezA@protonmail.ch>\n"
"Language-Team: Sinhala <https://hosted.weblate.org/projects/freedombox/"
@ -6343,7 +6343,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6352,14 +6352,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Slovenian <https://hosted.weblate.org/projects/freedombox/"
@ -6698,7 +6698,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6707,14 +6707,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-08 07:09+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
"Language-Team: Albanian <https://hosted.weblate.org/projects/freedombox/"
@ -7237,7 +7237,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7252,7 +7252,7 @@ msgstr ""
"Radicale mund të hyhet nga cilido përdorues me kredenciale hyrjeje në "
"{box_name}."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7262,7 +7262,7 @@ msgstr ""
"të ri dhe librash adresash. Smbulon shtim veprimtarish ose kontaktesh, çka "
"duhen bërë duke përdorur një tjetër klient."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2022-09-14 17:20+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Serbian <https://hosted.weblate.org/projects/freedombox/"
@ -6597,7 +6597,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6606,14 +6606,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-15 10:10+0000\n"
"Last-Translator: bittin1ddc447d824349b2 <bittin@reimu.nl>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/freedombox/"
@ -7176,7 +7176,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7190,7 +7190,7 @@ msgstr ""
"användarklient</a>. Radikal kan nås av alla användare med en {box_name} "
"inloggning."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7200,7 +7200,7 @@ msgstr ""
"skapandet av nya kalendrar och adressböcker. Det stöder inte att lägga till "
"händelser eller kontakter, som måste göras med hjälp av en separat klient."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-03-02 19:53+0000\n"
"Last-Translator: James Valleroy <jvalleroy@mailbox.org>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/freedombox/"
@ -7140,7 +7140,7 @@ msgstr "குவாசெல்ட்ராய்டு"
msgid "IRC"
msgstr "Irc"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7153,7 +7153,7 @@ msgstr ""
"radicale.org/master.html#supported-comients\"> ஆதரிக்கப்பட்ட கிளையன்ட் பயன்பாடு </"
"a> தேவை. {box_name} உள்நுழைவுடன் எந்த பயனரும் ராடிகலை அணுகலாம்."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7163,7 +7163,7 @@ msgstr ""
"முகவரி புத்தகங்களை உருவாக்குவதை மட்டுமே ஆதரிக்கிறது. இது நிகழ்வுகள் அல்லது "
"தொடர்புகளைச் சேர்ப்பதை ஆதரிக்காது, இது ஒரு தனி கிளையண்டைப் பயன்படுத்தி செய்யப்பட வேண்டும்."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "தீவிரமான"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-05-14 17:03+0000\n"
"Last-Translator: Sripath Roy Koganti <sripathroy@swecha.net>\n"
"Language-Team: Telugu <https://hosted.weblate.org/projects/freedombox/"
@ -7011,7 +7011,7 @@ msgstr "క్వాసెల్ డ్రొఇడ్"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7024,7 +7024,7 @@ msgstr ""
"href=\"https://radicale.org/master.html#supported-clients\">మద్దతు ఉన్న క్లయింట్ "
"అప్లికేషన్</a> అవసరం. {box_name} లాగిన్ ఉన్న ఏ యూజర్ అయినా Radicaleని యాక్సెస్ చేయవచ్చు."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7034,7 +7034,7 @@ msgstr ""
"రూపొందించడానికి మాత్రమే మద్దతు ఇస్తుంది. ఈవెంట్‌లు లేదా పరిచయాలను జోడించడానికి ఇది మద్దతు ఇవ్వదు, ఇది "
"ప్రత్యేక క్లయింట్‌ని ఉపయోగించి చేయాలి."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "రాడికేల్"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-09 10:09+0000\n"
"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/freedombox/"
@ -7191,7 +7191,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7205,7 +7205,7 @@ msgstr ""
"istemci uygulaması</a> gereklidir. Radicale'ye {box_name} oturum açma adı "
"ile herhangi bir kullanıcı tarafından erişilebilir."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7215,7 +7215,7 @@ msgstr ""
"temel bir web arayüzü sağlar. Ayrı bir istemci kullanılarak yapılması "
"zorunlu olan olayların veya kişilerin eklenmesini desteklemez."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-12-17 07:00+0000\n"
"Last-Translator: Максим Горпиніч <gorpinicmaksim0@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/freedombox/"
@ -7224,7 +7224,7 @@ msgstr "Quasseldroid"
msgid "IRC"
msgstr "IRC"
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -7238,7 +7238,7 @@ msgstr ""
"clients\">підтримувана клієнтська програма</a>. Radicale може отримати "
"доступ будь-який користувач із логіном {box_name}."
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
@ -7248,7 +7248,7 @@ msgstr ""
"календарів та адресних книг. Він не підтримує додавання подій або контактів, "
"для цього необхідно використовувати окремий клієнт."
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radicale"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2021-07-28 08:34+0000\n"
"Last-Translator: bruh <quangtrung02hn16@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/freedombox/"
@ -6774,7 +6774,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6783,14 +6783,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2026-04-08 07:09+0000\n"
"Last-Translator: 大王叫我来巡山 "
"<hamburger2048@users.noreply.hosted.weblate.org>\n"
@ -6542,7 +6542,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6555,14 +6555,14 @@ msgstr ""
"master.html#supported-clients\">支持的客户端应用程序</a>。任何拥有 "
"{box_name} 登录名的用户都可以访问 Radicale。"
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 22:01+0000\n"
"POT-Creation-Date: 2026-04-07 00:12+0000\n"
"PO-Revision-Date: 2025-02-07 12:01+0000\n"
"Last-Translator: pesder <j_h_liau@yahoo.com.tw>\n"
"Language-Team: Chinese (Traditional Han script) <https://hosted.weblate.org/"
@ -6674,7 +6674,7 @@ msgstr ""
msgid "IRC"
msgstr ""
#: plinth/modules/radicale/__init__.py:26
#: plinth/modules/radicale/__init__.py:27
#, python-brace-format
msgid ""
"Radicale is a CalDAV and CardDAV server. It allows synchronization and "
@ -6683,14 +6683,14 @@ msgid ""
"a> is needed. Radicale can be accessed by any user with a {box_name} login."
msgstr ""
#: plinth/modules/radicale/__init__.py:32
#: plinth/modules/radicale/__init__.py:33
msgid ""
"Radicale provides a basic web interface, which only supports creating new "
"calendars and addressbooks. It does not support adding events or contacts, "
"which must be done using a separate client."
msgstr ""
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr ""

View File

@ -5,6 +5,7 @@ FreedomBox app for radicale.
import logging
import augeas
from django.utils.translation import gettext_lazy as _
from plinth import app as app_module
@ -36,13 +37,15 @@ _description = [
logger = logging.getLogger(__name__)
CONFIG_FILE = '/etc/radicale/config'
class RadicaleApp(app_module.App):
"""FreedomBox app for Radicale."""
app_id = 'radicale'
_version = 6
_version = 5
def __init__(self) -> None:
"""Create components for the app."""
@ -126,7 +129,7 @@ class RadicaleApp(app_module.App):
if Version(package['new_version']) > Version('4~'):
return False
rights = privileged.get_rights_value()
rights = get_rights_value()
install(['radicale'], force_configuration='new')
privileged.setup()
privileged.configure(rights)
@ -137,3 +140,28 @@ class RadicaleApp(app_module.App):
"""De-configure and uninstall the app."""
super().uninstall()
privileged.uninstall()
def load_augeas():
"""Prepares the augeas."""
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
augeas.Augeas.NO_MODL_AUTOLOAD)
# INI file lens
aug.set('/augeas/load/Puppet/lens', 'Puppet.lns')
aug.set('/augeas/load/Puppet/incl[last() + 1]', CONFIG_FILE)
aug.load()
return aug
def get_rights_value():
"""Returns the current Rights value."""
aug = load_augeas()
value = aug.get('/files' + CONFIG_FILE + '/rights/type')
if value == 'from_file':
# Default rights file is equivalent to owner_only.
value = 'owner_only'
return value

View File

@ -1,45 +0,0 @@
(* Radicale module for Augeas
Based on Puppet lens.
Manage config file for http://radicale.org/
/etc/radicale/config is a standard INI File.
*)
module Radicale =
autoload xfm
(************************************************************************
* INI File settings
*
* /etc/radicale/config only supports "#" as commentary and "=" as separator
*************************************************************************)
let comment = IniFile.comment "#" "#"
let comment_re = /[#]/
let sep = IniFile.sep "=" "="
(************************************************************************
* ENTRY
* /etc/radicale/config uses standard INI File entries
*************************************************************************)
let entry = IniFile.entry_generic (Util.indent . key IniFile.entry_re) sep comment_re comment
(************************************************************************
* RECORD
* /etc/radicale/config uses standard INI File records
*************************************************************************)
let title = IniFile.indented_title IniFile.record_re
let record = IniFile.record title entry
(************************************************************************
* LENS & FILTER
* /etc/radicale/config uses standard INI File records
*************************************************************************)
let lns = IniFile.lns record comment
let filter = (incl "/etc/radicale/config")
let xfm = transform lns filter

View File

@ -1,81 +0,0 @@
module Test_radicale =
let conf = "
[server]
[encoding]
[well-known]
[auth]
[git]
[rights]
[storage]
[logging]
[headers]
Content-Security-Policy = default-src 'self'; object-src 'none'
"
test Radicale.lns get conf =
{}
{ "server"
{} }
{ "encoding"
{} }
{ "well-known"
{} }
{ "auth"
{} }
{ "git"
{} }
{ "rights"
{} }
{ "storage"
{} }
{ "logging"
{} }
{ "headers"
{ "Content-Security-Policy" = "default-src 'self'; object-src 'none'" }
{} }
test Radicale.lns put conf after
set "server/hosts" "127.0.0.1:5232, [::1]:5232";
set "server/base_prefix" "/radicale/";
set "well-known/caldav" "/radicale/%(user)s/caldav/";
set "well-known/cardav" "/radicale/%(user)s/carddav/";
set "auth/type" "remote_user";
set "rights/type" "owner_only";
set "headers/Content-Security-Policy" "default-src 'self'; object-src 'none'"
= "
[server]
hosts=127.0.0.1:5232, [::1]:5232
base_prefix=/radicale/
[encoding]
[well-known]
caldav=/radicale/%(user)s/caldav/
cardav=/radicale/%(user)s/carddav/
[auth]
type=remote_user
[git]
[rights]
type=owner_only
[storage]
[logging]
[headers]
Content-Security-Policy = default-src 'self'; object-src 'none'
"

View File

@ -24,7 +24,6 @@ def setup():
"""
aug = load_augeas()
aug.set('auth/type', 'remote_user')
aug.set('auth/lc_username', 'True')
aug.save()
# Service is started again by socket.
action_utils.service_stop(SERVICE_NAME)
@ -56,24 +55,12 @@ def load_augeas():
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
augeas.Augeas.NO_MODL_AUTOLOAD)
# INI file lens
aug.transform('Radicale', CONFIG_FILE)
aug.transform('Puppet', CONFIG_FILE)
aug.set('/augeas/context', '/files' + CONFIG_FILE)
aug.load()
return aug
def get_rights_value():
"""Returns the current Rights value."""
aug = load_augeas()
value = aug.get('rights/type')
if value == 'from_file':
# Default rights file is equivalent to owner_only.
value = 'owner_only'
return value
@privileged
def uninstall():
"""Remove all radicale collections."""

View File

@ -83,21 +83,21 @@ def _set_access_rights(browser, access_rights_type):
def _calendar_is_available(browser):
"""Return whether calendar is available at well-known URL."""
return _well_known_available(browser, '/.well-known/caldav')
conf = functional.config['DEFAULT']
url = functional.base_url + '/.well-known/caldav'
logging.captureWarnings(True)
request = requests.get(url, auth=(conf['username'], conf['password']),
verify=False)
logging.captureWarnings(False)
return request.status_code != 404
def _addressbook_is_available(browser):
"""Return whether addressbook is available at well-known URL."""
return _well_known_available(browser, '/.well-known/carddav')
def _well_known_available(browser, wellknown_url: str):
"""Return whether a well-known URL redirects to radicale."""
conf = functional.config['DEFAULT']
url = functional.base_url + wellknown_url
url = functional.base_url + '/.well-known/carddav'
logging.captureWarnings(True)
request = requests.get(url, auth=(conf['username'], conf['password']),
verify=False, allow_redirects=False)
verify=False)
logging.captureWarnings(False)
return (request.status_code == 301
and request.headers['Location'].endswith('/radicale/'))
return request.status_code != 404

View File

@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _
from plinth.views import AppView
from . import privileged
from . import get_rights_value, privileged
from .forms import RadicaleForm
@ -20,13 +20,13 @@ class RadicaleAppView(AppView):
def get_initial(self):
"""Return the values to fill in the form."""
initial = super().get_initial()
initial['access_rights'] = privileged.get_rights_value()
initial['access_rights'] = get_rights_value()
return initial
def form_valid(self, form):
"""Change the access control of Radicale service."""
data = form.cleaned_data
if privileged.get_rights_value() != data['access_rights']:
if get_rights_value() != data['access_rights']:
privileged.configure(data['access_rights'])
messages.success(self.request,
_('Access rights configuration updated'))

View File

@ -20,8 +20,7 @@ from plinth.action_utils import (get_addresses, get_hostname,
service_try_reload_or_restart,
service_try_restart, service_unmask, umask)
UNKNOWN = 'unknowndeamon.service'
UNKNOWN_SOCKET = 'unknowndeamon.socket'
UNKNOWN = 'unknowndeamon'
systemctl_path = pathlib.Path('/usr/bin/systemctl')
systemd_installed = pytest.mark.skipif(not systemctl_path.exists(),
@ -77,101 +76,20 @@ def test_service_enable_and_disable():
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_start(mock):
"""Test staring a service."""
def test_service_actions(mock):
"""Trivial white box test for trivial implementations."""
service_start(UNKNOWN)
mock.mock_calls = [call(UNKNOWN, 'start', check=False)]
mock.reset_mock()
service_start(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'start', check=True)]
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_stop(mock):
"""Test stopping a service."""
mock.assert_called_with(UNKNOWN, 'start', check=False)
service_stop(UNKNOWN)
assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)]
mock.reset_mock()
service_stop(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'stop', check=True)]
mock.reset_mock()
service_stop(UNKNOWN_SOCKET)
assert mock.mock_calls == [
call(UNKNOWN_SOCKET, 'stop', check=False),
call(UNKNOWN, 'stop', check=False)
]
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_restart(mock):
"""Test restaring a service."""
mock.assert_called_with(UNKNOWN, 'stop', check=False)
service_restart(UNKNOWN)
assert mock.mock_calls == [call(UNKNOWN, 'restart', check=False)]
mock.reset_mock()
service_restart(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'restart', check=True)]
mock.reset_mock()
service_restart(UNKNOWN_SOCKET)
assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)]
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_try_restart(mock):
"""Test try-restaring a service."""
mock.assert_called_with(UNKNOWN, 'restart', check=False)
service_try_restart(UNKNOWN)
assert mock.mock_calls == [call(UNKNOWN, 'try-restart', check=False)]
mock.reset_mock()
service_try_restart(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'try-restart', check=True)]
mock.reset_mock()
service_restart(UNKNOWN_SOCKET)
assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)]
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_reload(mock):
"""Test reloading a service."""
mock.assert_called_with(UNKNOWN, 'try-restart', check=False)
service_reload(UNKNOWN)
assert mock.mock_calls == [call(UNKNOWN, 'reload', check=False)]
mock.reset_mock()
service_reload(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'reload', check=True)]
mock.reset_mock()
service_reload(UNKNOWN_SOCKET)
assert mock.mock_calls == [call(UNKNOWN, 'reload', check=False)]
@patch('plinth.action_utils.service_action')
@systemd_installed
def test_service_try_reload_or_restart(mock):
"""Test try-reload-or-restart on a service."""
mock.assert_called_with(UNKNOWN, 'reload', check=False)
service_try_reload_or_restart(UNKNOWN)
assert mock.mock_calls == [
call(UNKNOWN, 'try-reload-or-restart', check=False)
]
mock.reset_mock()
service_try_reload_or_restart(UNKNOWN, check=True)
mock.mock_calls = [call(UNKNOWN, 'try-reload-or-restart', check=True)]
mock.reset_mock()
service_try_reload_or_restart(UNKNOWN_SOCKET)
assert mock.mock_calls == [
call(UNKNOWN, 'try-reload-or-restart', check=False)
]
mock.assert_called_with(UNKNOWN, 'try-reload-or-restart', check=False)
@pytest.mark.usefixtures('needs_root')