From 7fff73bc1cfd11d53b3f36be6882d830d00e9c2a Mon Sep 17 00:00:00 2001 From: JakobDev Date: Tue, 13 Dec 2022 12:18:25 +0100 Subject: [PATCH 1/2] Add validation for custom tag --- src/as-validator-issue-tag.h | 20 ++++++++++++++++ src/as-validator.c | 45 +++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/as-validator-issue-tag.h b/src/as-validator-issue-tag.h index 6c9852a5..3c168494 100644 --- a/src/as-validator-issue-tag.h +++ b/src/as-validator-issue-tag.h @@ -921,6 +921,26 @@ AsValidatorIssueTag as_validator_issue_tag_list[] = { N_("This color is not a valid HTML color code."), }, + { "custom-invalid-tag", + AS_ISSUE_SEVERITY_ERROR, + N_("The custom tags can only contains value tags"), + }, + + { "custom-key-missing", + AS_ISSUE_SEVERITY_ERROR, + N_("This custom tag is missing the 'key attribute"), + }, + + { "custom-key-duplicated", + AS_ISSUE_SEVERITY_ERROR, + N_("A key can only be used once"), + }, + + { "custom-value-missing", + AS_ISSUE_SEVERITY_ERROR, + N_("This custom tag is missing a value"), + }, + { "metainfo-localized-keywords-tag", AS_ISSUE_SEVERITY_ERROR, N_("A tag must not be localized in metainfo files (upstream metadata). " diff --git a/src/as-validator.c b/src/as-validator.c index 27de13f0..257df9a8 100644 --- a/src/as-validator.c +++ b/src/as-validator.c @@ -1924,6 +1924,49 @@ as_validator_check_branding (AsValidator *validator, xmlNode *node) } } +/** + * as_validator_check_branding: + **/ +static void +as_validator_check_custom (AsValidator *validator, xmlNode *node) +{ + g_autoptr(GHashTable) known_keys = NULL; + known_keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + for (xmlNode *iter = node->children; iter != NULL; iter = iter->next) { + if (iter->type != XML_ELEMENT_NODE) + continue; + + g_autofree gchar *node_content = NULL; + const gchar *node_name; + + node_name = (const gchar*) iter->name; + + if (g_strcmp0 (node_name, "value") != 0) { + as_validator_add_issue (validator, iter, "custom-invalid-tag", node_name); + continue; + } + + gchar *key_name = NULL; + key_name = as_xml_get_prop_value (iter, "key"); + + if (key_name == NULL) { + as_validator_add_issue (validator, iter, "custom-key-missing", NULL); + continue; + } + + if (g_hash_table_contains (known_keys, key_name)) + as_validator_add_issue (validator, iter, "custom-key-duplicated", key_name); + else + g_hash_table_add (known_keys, key_name); + + node_content = (gchar*) xmlNodeGetContent (iter); + if (strlen(node_content) == 0) { + as_validator_add_issue (validator, iter, "custom-value-missing", NULL); + } + } +} + /** * as_validator_validate_component_node: **/ @@ -2244,7 +2287,7 @@ as_validator_validate_component_node (AsValidator *validator, AsContext *ctx, xm as_validator_check_appear_once (validator, iter, found_tags, FALSE); } else if (g_strcmp0 (node_name, "custom") == 0) { as_validator_check_appear_once (validator, iter, found_tags, FALSE); - as_validator_check_children_quick (validator, iter, "value", FALSE); + as_validator_check_custom (validator, iter); } else if ((g_strcmp0 (node_name, "metadata") == 0) || (g_strcmp0 (node_name, "kudos") == 0)) { /* these tags are GNOME / Fedora specific extensions and are therefore quite common. They shouldn't make the validation fail, * especially if we might standardize at leat the tag one day, but we should still complain about those tags to make From 9362c1e758133c926d0d14c697f826ba35ad1d09 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Tue, 13 Dec 2022 12:25:41 +0100 Subject: [PATCH 2/2] Fix typo --- src/as-validator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/as-validator.c b/src/as-validator.c index 257df9a8..47badaa2 100644 --- a/src/as-validator.c +++ b/src/as-validator.c @@ -1925,7 +1925,7 @@ as_validator_check_branding (AsValidator *validator, xmlNode *node) } /** - * as_validator_check_branding: + * as_validator_check_custom: **/ static void as_validator_check_custom (AsValidator *validator, xmlNode *node)