diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py --- a/swh/model/identifiers.py +++ b/swh/model/identifiers.py @@ -848,14 +848,22 @@ _metadata = {} for part in swhid_parts: try: - qualifier, val = part.split("=") + qualifier, qualifier_value = part.split("=") if qualifier not in CONTEXT_QUALIFIERS: error_msg = ( f"Invalid SWHID: qualifier must be one " f" of {', '.join(CONTEXT_QUALIFIERS)}" ) raise ValidationError(error_msg) - _metadata[qualifier] = val + + qualifier_value_stripped = qualifier_value.strip() + if qualifier_value_stripped != qualifier_value: + error_msg = ( + "Invalid SwHID: qualifier value must be free of blank characters " + " before or after its value" + ) + raise ValidationError(error_msg) + _metadata[qualifier] = qualifier_value except Exception: raise ValidationError( "Invalid SWHID: contextual data must be a ;-separated list of " diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py --- a/swh/model/tests/test_identifiers.py +++ b/swh/model/tests/test_identifiers.py @@ -1069,6 +1069,10 @@ "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anchor=1;visit=1;pa=/", # noqa # qualifier off: line should be lines "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;line=10;origin=something;anchor=1;visit=1;path=/", # noqa + # qualifier value is off: it contains space before of after + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin= https://some-url", # noqa + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anchor=some-anchor ", # noqa + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anchor=some-anchor ;visit=1", # noqa ], ) def test_parse_swhid_parsing_error(invalid_swhid):