diff options
author | Richard Hughes <richard@hughsie.com> | 2016-08-05 10:20:31 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-08-05 10:20:31 +0100 |
commit | e060e8c4b5c0a568f17386a4d401d384abf48633 (patch) | |
tree | 9e629c570699c251cfefdcb1f3da390547a1fede | |
parent | 86a164816e56b4fe9fe87ae52a332394a3f8c7de (diff) | |
download | appstream-glib-e060e8c4b5c0a568f17386a4d401d384abf48633.tar.gz |
Add some more validation checks for keywords
-rw-r--r-- | libappstream-glib/as-app-private.h | 4 | ||||
-rw-r--r-- | libappstream-glib/as-app-validate.c | 14 | ||||
-rw-r--r-- | libappstream-glib/as-app.c | 24 |
3 files changed, 42 insertions, 0 deletions
diff --git a/libappstream-glib/as-app-private.h b/libappstream-glib/as-app-private.h index 6230a50..5637479 100644 --- a/libappstream-glib/as-app-private.h +++ b/libappstream-glib/as-app-private.h @@ -51,6 +51,8 @@ G_BEGIN_DECLS * @AS_APP_PROBLEM_UPDATECONTACT_FALLBACK: The file used <updatecontact> without a space * @AS_APP_PROBLEM_INVALID_PROJECT_GROUP: Invalid project group detected * @AS_APP_PROBLEM_INVALID_XML_TAG: Invalid XML tag name detected + * @AS_APP_PROBLEM_EXPECTED_CHILDREN: Children tags expected + * @AS_APP_PROBLEM_INVALID_KEYWORDS: One or more keywords was invalid * * The application problems detected when loading. **/ @@ -71,6 +73,8 @@ typedef enum { AS_APP_PROBLEM_UPDATECONTACT_FALLBACK = 1 << 12, AS_APP_PROBLEM_INVALID_PROJECT_GROUP = 1 << 13, AS_APP_PROBLEM_INVALID_XML_TAG = 1 << 14, + AS_APP_PROBLEM_EXPECTED_CHILDREN = 1 << 15, + AS_APP_PROBLEM_INVALID_KEYWORDS = 1 << 16, /*< private >*/ AS_APP_PROBLEM_LAST } AsAppProblems; diff --git a/libappstream-glib/as-app-validate.c b/libappstream-glib/as-app-validate.c index 57da467..9c421be 100644 --- a/libappstream-glib/as-app-validate.c +++ b/libappstream-glib/as-app-validate.c @@ -1297,6 +1297,20 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) "XML data contains unknown tag"); } + /* only allow XML in the specification */ + if (problems & AS_APP_PROBLEM_EXPECTED_CHILDREN) { + ai_app_validate_add (&helper, + AS_PROBLEM_KIND_TAG_INVALID, + "Expected children for tag"); + } + + /* only allow XML in the specification */ + if (problems & AS_APP_PROBLEM_INVALID_KEYWORDS) { + ai_app_validate_add (&helper, + AS_PROBLEM_KIND_TAG_INVALID, + "<keyword> invalid contents"); + } + /* check for things that have to exist */ if (as_app_get_id (app) == NULL) { ai_app_validate_add (&helper, diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c index 5ff0c45..bdcbcf6 100644 --- a/libappstream-glib/as-app.c +++ b/libappstream-glib/as-app.c @@ -4115,6 +4115,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; as_app_add_category (app, tmp); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <architectures> */ @@ -4129,6 +4131,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; g_ptr_array_add (priv->architectures, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <keywords> */ @@ -4144,9 +4148,13 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, taken = as_node_fix_locale (as_node_get_attribute (c, "xml:lang")); if (taken == NULL) continue; + if (g_strstr_len (tmp, -1, ",") != NULL) + priv->problems |= AS_APP_PROBLEM_INVALID_KEYWORDS; as_app_add_keyword (app, taken, tmp); g_free (taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <kudos> */ @@ -4161,6 +4169,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; g_ptr_array_add (priv->kudos, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <permissions> */ @@ -4175,6 +4185,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; g_ptr_array_add (priv->permissions, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <vetos> */ @@ -4189,6 +4201,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; g_ptr_array_add (priv->vetos, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <mimetypes> */ @@ -4203,6 +4217,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, continue; g_ptr_array_add (priv->mimetypes, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <project_license> */ @@ -4283,6 +4299,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, return FALSE; as_app_add_screenshot (app, ss); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <reviews> */ @@ -4324,6 +4342,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, return FALSE; as_app_add_release (app, r); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <provides> */ @@ -4353,6 +4373,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, as_app_add_language (app, percent, as_node_get_data (c)); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; /* <metadata> */ @@ -4369,6 +4391,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, taken = g_strdup (""); g_hash_table_insert (priv->metadata, key, taken); } + if (n->children == NULL) + priv->problems |= AS_APP_PROBLEM_EXPECTED_CHILDREN; break; default: priv->problems |= AS_APP_PROBLEM_INVALID_XML_TAG; |