diff options
author | Sangyoon Jang <s89.jang@samsung.com> | 2016-02-11 14:50:39 +0900 |
---|---|---|
committer | Sangyoon Jang <s89.jang@samsung.com> | 2016-02-15 10:36:45 +0900 |
commit | dc24a380d036d4d6096d26b4d892ad0bd48aeb7c (patch) | |
tree | 82289351d140f7c2e0237de848ef74f8a8176044 | |
parent | b6c43a62c636128ae805f4d1da490b4051bfaacd (diff) | |
download | aul-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.c | 44 | ||||
-rw-r--r-- | src/aul_rsc_mgr_schema.h | 37 |
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 |