summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSangyoon Jang <s89.jang@samsung.com>2016-02-11 14:50:39 +0900
committerSangyoon Jang <s89.jang@samsung.com>2016-02-15 10:36:45 +0900
commitdc24a380d036d4d6096d26b4d892ad0bd48aeb7c (patch)
tree82289351d140f7c2e0237de848ef74f8a8176044
parentb6c43a62c636128ae805f4d1da490b4051bfaacd (diff)
downloadaul-1-dc24a380d036d4d6096d26b4d892ad0bd48aeb7c.tar.gz
aul-1-dc24a380d036d4d6096d26b4d892ad0bd48aeb7c.tar.bz2
aul-1-dc24a380d036d4d6096d26b4d892ad0bd48aeb7c.zip
Validate resource manifest
Change-Id: I58c6577b08a898feed901fafbdd1e17f3c031ded Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
-rw-r--r--src/aul_rsc_mgr_internal.c44
-rw-r--r--src/aul_rsc_mgr_schema.h37
2 files changed, 80 insertions, 1 deletions
diff --git a/src/aul_rsc_mgr_internal.c b/src/aul_rsc_mgr_internal.c
index 3b1a5777..760059e4 100644
--- a/src/aul_rsc_mgr_internal.c
+++ b/src/aul_rsc_mgr_internal.c
@@ -20,11 +20,13 @@
#include <glib.h>
#include <libxml/tree.h>
+#include <libxml/xmlschemas.h>
#include <dlog.h>
#include <bundle.h>
#include "aul_rsc_mgr_internal.h"
+#include "aul_rsc_mgr_schema.h"
static char *_get_attribute(xmlNode *xml_node, const char *name)
{
@@ -145,13 +147,53 @@ static int _parse_resource(xmlNode *xml_node, resource_data_t **data)
return 0;
}
+static int __validate_schema(const char *path)
+{
+ xmlSchemaParserCtxt *parser_ctxt;
+ xmlSchema *schema;
+ xmlSchemaValidCtxt *valid_ctxt;
+ int ret;
+
+ parser_ctxt = xmlSchemaNewMemParserCtxt(res_schema, sizeof(res_schema));
+ if (parser_ctxt == NULL) {
+ LOGE("failed to create parser context");
+ return -1;
+ }
+
+ schema = xmlSchemaParse(parser_ctxt);
+ if (schema == NULL) {
+ LOGE("failed to create schema");
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+ return -1;
+ }
+
+ valid_ctxt = xmlSchemaNewValidCtxt(schema);
+ if (valid_ctxt == NULL) {
+ LOGE("failed to create valid context");
+ xmlSchemaFree(schema);
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+ return -1;
+ }
+
+ ret = xmlSchemaValidateFile(valid_ctxt, path, 0);
+ if (ret)
+ LOGE("%s: validation failed(%d)", path, ret);
+
+ xmlSchemaFreeValidCtxt(valid_ctxt);
+ xmlSchemaFree(schema);
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+
+ return ret;
+}
+
int _resource_open(const char *path, resource_data_t **data)
{
int ret;
xmlDoc *doc;
xmlNode *root;
- /* TODO: validate ? */
+ if (__validate_schema(path))
+ return -1;
doc = xmlReadFile(path, NULL, 0);
if (doc == NULL)
return -1;
diff --git a/src/aul_rsc_mgr_schema.h b/src/aul_rsc_mgr_schema.h
new file mode 100644
index 00000000..5bae1eaf
--- /dev/null
+++ b/src/aul_rsc_mgr_schema.h
@@ -0,0 +1,37 @@
+#ifndef __AUL_RSC_MGR_SCHEMA_H__
+#define __AUL_RSC_MGR_SCHEMA_H__
+
+static const char res_schema[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+"<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" targetNamespace=\"http://tizen.org/ns/rm\" xmlns:packages=\"http://tizen.org/ns/rm\">"
+" <xs:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>"
+" <xs:element name=\"res\">"
+" <xs:complexType>"
+" <xs:all>"
+" <xs:element name=\"group-image\" type=\"packages:GroupContainer\" maxOccurs=\"1\" minOccurs=\"0\"/>"
+" <xs:element name=\"group-layout\" type=\"packages:GroupContainer\" maxOccurs=\"1\" minOccurs=\"0\"/>"
+" <xs:element name=\"group-sound\" type=\"packages:GroupContainer\" maxOccurs=\"1\" minOccurs=\"0\"/>"
+" <xs:element name=\"group-bin\" type=\"packages:GroupContainer\" maxOccurs=\"1\" minOccurs=\"0\"/>"
+" </xs:all>"
+" </xs:complexType>"
+" </xs:element>"
+" <xs:complexType name=\"GroupContainer\">"
+" <xs:sequence>"
+" <xs:element name=\"node\" maxOccurs=\"unbounded\" minOccurs=\"0\">"
+" <xs:complexType>"
+" <xs:attribute name=\"folder\" type=\"xs:string\" use=\"required\"/>"
+" <xs:attribute name=\"screen-dpi\" type=\"xs:integer\"/>"
+" <xs:attribute name=\"screen-dpi-range\" type=\"xs:string\"/>"
+" <xs:attribute name=\"screen-width-range\" type=\"xs:string\"/>"
+" <xs:attribute name=\"screen-large\" type=\"xs:boolean\"/>"
+" <xs:attribute name=\"screen-bpp\" type=\"xs:integer\"/>"
+" <xs:attribute name=\"platform-version\" type=\"xs:string\"/>"
+" <xs:attribute name=\"language\" type=\"xs:string\"/>"
+" </xs:complexType>"
+" </xs:element>"
+" </xs:sequence>"
+" <xs:attribute name=\"folder\" type=\"xs:string\" use=\"required\"/>"
+" </xs:complexType>"
+"</xs:schema>";
+
+#endif