From f4b7872f4228b6bb6517f1c704d999e953a51ff6 Mon Sep 17 00:00:00 2001 From: Xpirix Date: Mon, 20 Jan 2025 14:57:40 +0300 Subject: [PATCH 1/2] Checks for multiline values in metadata.txt --- qgis-app/plugins/tests/test_validator.py | 23 +++++++++++++++++ .../testfiles/invalid_metadata_multiline.zip_ | Bin 0 -> 45661 bytes qgis-app/plugins/validator.py | 24 +++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 qgis-app/plugins/tests/testfiles/invalid_metadata_multiline.zip_ diff --git a/qgis-app/plugins/tests/test_validator.py b/qgis-app/plugins/tests/test_validator.py index bfde21af..65700430 100644 --- a/qgis-app/plugins/tests/test_validator.py +++ b/qgis-app/plugins/tests/test_validator.py @@ -18,8 +18,10 @@ def setUp(self): ) web_not_exist_plugins = os.path.join(TESTFILE_DIR, "web_not_exist.zip") valid_plugins = os.path.join(TESTFILE_DIR, "valid_metadata_link.zip") + invalid_metadata_multiline = os.path.join(TESTFILE_DIR, "invalid_metadata_multiline.zip_") self.valid_metadata_link = open(valid_plugins, "rb") self.invalid_metadata_link = open(invalid_plugins, "rb") + self.invalid_metadata_multiline = open(invalid_metadata_multiline, "rb") self.web_not_exist = open(web_not_exist_plugins, "rb") self.invalid_url_scheme = open(invalid_url_scheme_plugins, "rb") @@ -65,6 +67,27 @@ def test_invalid_metadata_link_tracker_repo_homepage(self): charset="utf8", ), ) + + def test_invalid_metadata_multiline_attribute(self): + """ + The invalid_metadata_multiline.zip contains metadata file with + a multiline attribute that is commented but still has value. + The parser will append the value of the attribute to the previous + one and make it invalid. + """ + + self.assertRaises( + ValidationError, + validator, + InMemoryUploadedFile( + self.invalid_metadata_multiline, + field_name="tempfile", + name="testfile.zip", + content_type="application/zip", + size=39889, + charset="utf8", + ), + ) def test_invalid_metadata_url_scheme(self): """ diff --git a/qgis-app/plugins/tests/testfiles/invalid_metadata_multiline.zip_ b/qgis-app/plugins/tests/testfiles/invalid_metadata_multiline.zip_ new file mode 100644 index 0000000000000000000000000000000000000000..afcd4fb51899f1c938248c164e4b1618f6f3ddc9 GIT binary patch literal 45661 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 literal 0 HcmV?d00001 diff --git a/qgis-app/plugins/validator.py b/qgis-app/plugins/validator.py index e75d9755..ebb3a34c 100644 --- a/qgis-app/plugins/validator.py +++ b/qgis-app/plugins/validator.py @@ -96,6 +96,28 @@ def _check_required_metadata(metadata): ) ) +def _check_multiline_metadata(metadata): + """ + Only the fields 'description', 'about' and 'changelog' can be multiline + If other fields are multiline, raise ValidationError + """ + allowed_multiline_fields = ['description', 'about', 'changelog'] + multiline_fields = [ + field for field in [item[0] for item in metadata] + if field not in ['description', 'about', 'changelog'] and '\n' in dict(metadata).get(field, '') + ] + if len(multiline_fields) > 0: + multiline_fields_str = ', '.join(multiline_fields) + allowed_multiline_fields_str = ', '.join(allowed_multiline_fields) + raise ValidationError( + _( + f'The following metadata fields must be single-line: {multiline_fields_str}. ' + 'Please ensure these fields contain single-line values only. Note that multiline values can also occur if an allowed ' + f'multiline field ({allowed_multiline_fields_str}) is commented out but still contains a multiline value.' + ) + ) + + def _check_url_link(urls): """ Checks if all the url link is valid. @@ -293,6 +315,7 @@ def validator(package, is_new: bool = False): metadata.append(("metadata_source", "__init__.py")) _check_required_metadata(metadata) + _check_multiline_metadata(metadata) # Process Icon try: @@ -375,7 +398,6 @@ def validator(package, is_new: bool = False): if "author" in dict(metadata): if not re.match(r"^[^/]+$", dict(metadata)["author"]): raise ValidationError(_("Author name cannot contain slashes.")) - # strip and check checked_metadata = [] for k, v in metadata: From 328d69763b3c4d541726d8415ace51221e5aee50 Mon Sep 17 00:00:00 2001 From: Xpirix Date: Mon, 20 Jan 2025 15:13:28 +0300 Subject: [PATCH 2/2] Fix lint error --- qgis-app/plugins/tests/test_validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgis-app/plugins/tests/test_validator.py b/qgis-app/plugins/tests/test_validator.py index 65700430..641870e9 100644 --- a/qgis-app/plugins/tests/test_validator.py +++ b/qgis-app/plugins/tests/test_validator.py @@ -67,7 +67,7 @@ def test_invalid_metadata_link_tracker_repo_homepage(self): charset="utf8", ), ) - + def test_invalid_metadata_multiline_attribute(self): """ The invalid_metadata_multiline.zip contains metadata file with