From d1006dfa0448c4973e735af39055831c677234f8 Mon Sep 17 00:00:00 2001 From: UlrichB22 <97119703+UlrichB22@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:20:59 +0200 Subject: [PATCH] Add itemlinks validator --- src/moin/storage/middleware/indexing.py | 9 +++++---- src/moin/storage/middleware/validation.py | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/moin/storage/middleware/indexing.py b/src/moin/storage/middleware/indexing.py index 431ec6daf..d5d6451b3 100644 --- a/src/moin/storage/middleware/indexing.py +++ b/src/moin/storage/middleware/indexing.py @@ -1,6 +1,7 @@ # Copyright: 2011 MoinMoin:RonnyPfannschmidt # Copyright: 2011 MoinMoin:ThomasWaldmann # Copyright: 2011 MoinMoin:MichaelMayorov +# Copyright: 2024 MoinMoin:UlrichB # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. """ @@ -1241,10 +1242,10 @@ def store_revision( logging.warning("data validation skipped because metadata is invalid, see below") val = [] for e in m.children: - if e.name == "subscriptions": - for sub in e.children: - if sub.valid is False: - val.append(f'"{str(sub)}". {str(sub.errors[0])}') + if e.name in ["itemlinks", "subscriptions"]: + for child in e.children: + if child.valid is False: + val.append(f'"{str(child)}". {str(child.errors[0])}') e.valid = False elif e.valid is False: val.append(str(e)) diff --git a/src/moin/storage/middleware/validation.py b/src/moin/storage/middleware/validation.py index 7c8a5f20c..51c0020cc 100644 --- a/src/moin/storage/middleware/validation.py +++ b/src/moin/storage/middleware/validation.py @@ -1,4 +1,5 @@ # Copyright: 2011,2012 MoinMoin:ThomasWaldmann +# Copyright: 2024 MoinMoin:UlrichB # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. """ @@ -110,6 +111,23 @@ def name_validator(element, state): return True +def itemlink_validator(element, state): + """an itemlink""" + if element.raw is Unset: + element.set(state[keys.NAME]) + v = element.value + if not isinstance(v, str): + return False + if v != v.strip(): + return False + if v.startswith("/") or v.endswith("/"): + element.add_error("Itemlink may not start or end with '/'.") + return False + if "//" in v: # empty ancestor name is invalid + return False + return True + + def tag_validator(element, state): """ a tag @@ -395,7 +413,7 @@ def subscription_validator(element, state): String.named(keys.HASH_ALGORITHM).validated_by(hash_validator), String.named(keys.DATAID).validated_by(uuid_validator).using(optional=True), # markup items may have this: - List.named(keys.ITEMLINKS).of(String.named("itemlink").validated_by(wikiname_validator)).using(optional=True), + List.named(keys.ITEMLINKS).of(String.named("itemlink").validated_by(itemlink_validator)).using(optional=True), List.named(keys.ITEMTRANSCLUSIONS) .of(String.named("itemtransclusion").validated_by(wikiname_validator)) .using(optional=True),