From b156317a2998edba99aa305f15e562a78a73f2f2 Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Fri, 19 Jun 2026 05:57:05 +0200 Subject: [PATCH 1/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31b03649..536005f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## 3.7.6.dev +* Extension: item verification on commandline ## 3.7.5 * Add: [sharing] conversion_bday_summary_template (customize summary) From ecb0cc8647705f7e1f6c62e09f23c6413673d159 Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Fri, 19 Jun 2026 06:02:31 +0200 Subject: [PATCH 2/4] extend item verification code on commandline --- radicale/item/__init__.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/radicale/item/__init__.py b/radicale/item/__init__.py index 565488a1..60d2eccc 100644 --- a/radicale/item/__init__.py +++ b/radicale/item/__init__.py @@ -377,7 +377,38 @@ def verify(file: str, encoding: str): logger.info("Item content (hexdump/lines):\n%s", utils.hexdump_lines(content)) return False else: - logger.info("Verifying item: %s successful", file) + logger.info("Verifying item(vobject/read_components): %s successful", file) + + try: + tag = radicale_item.predict_tag_of_whole_collection(vobject_items) + radicale_item.check_and_sanitize_items(vobject_items, tag=tag) + except Exception as e: + logger.error("Verifying item: %s problem: %s", file, e) + logger.warning("Item content:\n%s", utils.textwrap_str(content)) + return False + else: + logger.info("Verifying item(radicale/check_and_sanitze): %s successful", file) + + vobject_item, = vobject_items + + try: + item = radicale_item.Item(collection_path="verify", vobject_item=vobject_item) + except Exception as e: + logger.error("Verifying item: %s problem: %s", file, e) + logger.warning("Item content:\n%s", utils.textwrap_str(content)) + return False + else: + logger.info("Verifying item(radicale/Item): %s successful", file) + + try: + item.prepare() + except Exception as e: + logger.error("Verifying item: %s problem: %s", file, e) + logger.warning("Item content:\n%s", utils.textwrap_str(content)) + return False + else: + logger.info("Verifying item(radicale/prepare): %s successful", file) + return True From a62e3076ab44c06cc1f8693953f6c756be95d159 Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Fri, 19 Jun 2026 06:05:51 +0200 Subject: [PATCH 3/4] lost line --- radicale/item/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/radicale/item/__init__.py b/radicale/item/__init__.py index 60d2eccc..c2392385 100644 --- a/radicale/item/__init__.py +++ b/radicale/item/__init__.py @@ -37,6 +37,7 @@ from typing import (Any, Callable, List, MutableMapping, Optional, Sequence, import vobject +import radicale.item as radicale_item from radicale import storage # noqa:F401 from radicale import pathutils, sharing, utils from radicale.item import filter as radicale_filter From ddaa187e038d4d7f70f342f892291e95bf64bc7d Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Fri, 19 Jun 2026 06:13:49 +0200 Subject: [PATCH 4/4] catch not resolvable tag --- radicale/item/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/radicale/item/__init__.py b/radicale/item/__init__.py index c2392385..c6419526 100644 --- a/radicale/item/__init__.py +++ b/radicale/item/__init__.py @@ -382,7 +382,10 @@ def verify(file: str, encoding: str): try: tag = radicale_item.predict_tag_of_whole_collection(vobject_items) - radicale_item.check_and_sanitize_items(vobject_items, tag=tag) + if tag is not None: + radicale_item.check_and_sanitize_items(vobject_items, tag=tag) + else: + raise ValueError("collection tag cannot be predicted") except Exception as e: logger.error("Verifying item: %s problem: %s", file, e) logger.warning("Item content:\n%s", utils.textwrap_str(content))