summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-08-05 10:20:31 +0100
committerRichard Hughes <richard@hughsie.com>2016-08-05 10:20:31 +0100
commite060e8c4b5c0a568f17386a4d401d384abf48633 (patch)
tree9e629c570699c251cfefdcb1f3da390547a1fede
parent86a164816e56b4fe9fe87ae52a332394a3f8c7de (diff)
downloadappstream-glib-e060e8c4b5c0a568f17386a4d401d384abf48633.tar.gz
Add some more validation checks for keywords
-rw-r--r--libappstream-glib/as-app-private.h4
-rw-r--r--libappstream-glib/as-app-validate.c14
-rw-r--r--libappstream-glib/as-app.c24
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;