Fix ui-application validation 16/61016/4
authorTomasz Iwanek <t.iwanek@samsung.com>
Wed, 2 Mar 2016 13:03:04 +0000 (14:03 +0100)
committerTomasz Iwanek <t.iwanek@samsung.com>
Mon, 7 Mar 2016 09:13:13 +0000 (10:13 +0100)
 - validation of <label> xml:lang attribute,
 - check value of 'multiple' attribute,
 - check value of 'taskmanage' attribute,
 - check value of 'nodisplay' attribute,
 - check name attribute on appcontrol's operation,
 - check name attribute on appcontrol's mime,
 - check name attribute on appcontrol's uri.

Change-Id: I4f39295e52b18361c153d928e8ccb857f85f89c2

src/tpk_manifest_handlers/common/application_handler.cc
src/tpk_manifest_handlers/common/application_handler.h
src/tpk_manifest_handlers/ui_application_handler.cc
src/tpk_manifest_handlers/widget_application_handler.cc

index 25a6aa86489dff885b7631865b3a4d3ea8392afd..fcbb5f98f7979855b03d11a6de41a6d7a8b7e3a2 100644 (file)
@@ -12,7 +12,7 @@ const char kAppControlKey[] = "app-control";
 const char kAppControlOperationKey[] = "operation";
 const char kAppControlURIKey[] = "uri";
 const char kAppControlMimeKey[] = "mime";
-const char kAppControlNameChildKey[] = "@name";
+const char kAppControlNameKey[] = "@name";
 
 // background-category
 const char kBackgroundCategoryKey[] = "background-category";
index 9de7074cf256f1ca2793944079e72bc5e4043aa0..6fb1db1d617029154fa5a23ec1bb674cb73b4f6b 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "manifest_parser/manifest_handler.h"
 #include "manifest_parser/utils/iri_util.h"
+#include "manifest_parser/utils/language_tag_validator.h"
 #include "manifest_parser/utils/version_number.h"
 #include "manifest_parser/values.h"
 #include "tpk_manifest_handlers/ui_and_service_application_infos.h"
@@ -24,7 +25,7 @@ extern const char kAppControlKey[];
 extern const char kAppControlOperationKey[];
 extern const char kAppControlURIKey[];
 extern const char kAppControlMimeKey[];
-extern const char kAppControlNameChildKey[];
+extern const char kAppControlNameKey[];
 
 // background-category
 extern const char kBackgroundCategoryKey[];
@@ -115,28 +116,46 @@ struct ApplicationInfoList : public parser::ManifestData {
 
 template<typename T>
 bool ParseAppControl(const parser::DictionaryValue& dict,
-                     T* info, std::string*) {
+                     T* info, std::string* error) {
   for (const auto& item_operation : parser::GetOneOrMany(&dict,
       tpk_app_keys::kAppControlOperationKey, "")) {
     std::string operation;
-    std::string uri;
-    std::string mime;
-    item_operation->GetString(
-        tpk_app_keys::kAppControlNameChildKey, &operation);
+    if (!item_operation->GetString(
+        tpk_app_keys::kAppControlNameKey, &operation)) {
+      *error = "appcontrol operation is missing name attribute";
+      return false;
+    }
 
-    auto uri_items = parser::GetOneOrMany(
-        &dict, tpk_app_keys::kAppControlURIKey, "");
-    auto mime_items = parser::GetOneOrMany(
-        &dict, tpk_app_keys::kAppControlMimeKey, "");
+    std::vector<std::string> uris;
+    for (auto& uri_item : parser::GetOneOrMany(&dict,
+        tpk_app_keys::kAppControlURIKey, "")) {
+      std::string uri;
+      if (!uri_item->GetString(tpk_app_keys::kAppControlNameKey, &uri))  {
+        *error = "appcontrol uri is missing name attribute";
+        return false;
+      }
+      uris.push_back(uri);
+    }
 
-    if (uri_items.empty()) uri_items.push_back(new parser::DictionaryValue());
-    if (mime_items.empty()) mime_items.push_back(new parser::DictionaryValue());
+    std::vector<std::string> mimes;
+    for (auto& mime_item : parser::GetOneOrMany(
+        &dict, tpk_app_keys::kAppControlMimeKey, "")) {
+      std::string mime;
+      if (!mime_item->GetString(tpk_app_keys::kAppControlNameKey,
+                                &mime))  {
+        *error = "appcontrol mime is missing name attribute";
+        return false;
+      }
+      mimes.push_back(mime);
+    }
 
-    for (const auto& item_uri : uri_items) {
-      item_uri->GetString(tpk_app_keys::kAppControlNameChildKey, &uri);
+    if (uris.empty())
+      uris.push_back("");
+    if (mimes.empty())
+      mimes.push_back("");
 
-      for (const auto& item_mime : mime_items) {
-        item_mime->GetString(tpk_app_keys::kAppControlNameChildKey, &mime);
+    for (const auto& uri : uris) {
+      for (const auto& mime : mimes) {
         info->app_control.emplace_back(operation, uri, mime);
       }
     }
@@ -340,10 +359,16 @@ bool LabelValidation(const T& it, std::string* error) {
     return false;
   }
 
-  if (std::any_of(it.label.begin(), it.label.end(),
-      [](const LabelInfo& item) { return item.name().empty(); })) {
-    *error = "The name child element of label element is obligatory";
-    return false;
+  for (auto& label : it.label) {
+    if (label.name().empty()) {
+      *error = "The name child element of label element is obligatory";
+      return false;
+    }
+    if (!label.xml_lang().empty() &&
+        !utils::w3c_languages::ValidateLanguageTag(label.xml_lang())) {
+      *error = "The xml:lang attribute of label is invalid";
+      return false;
+    }
   }
 
   return true;
index 4dcaf4e3d1bfad2092c872e9f50dad7e45e43985..1afd58e4c1c569a20587f6cf61cb56c0d6615664 100644 (file)
@@ -39,9 +39,12 @@ const char kUIApplicationIndicatorDisplayKey[] = "@indicatordisplay";
 const char kUIApplicationPortraitEffectImageKey[] = "@portrait-effectimage";
 const char kUIApplicationLandscapeEffectImageKey[] = "@landscape-effectimage";
 const char kUIApplicationEffectImageTypeKey[] = "@effectimage-type";
-const char kUIApplicationHwAccelerationKey[] = "@hwacceleration";
+const char kUIApplicationHwAccelerationKey[] = "@hw-acceleration";
 const char kUIApplicationKey[] = "manifest.ui-application";
 
+const char kTrue[] = "true";
+const char kFalse[] = "false";
+
 // manifest
 const char kManifestKey[] = "manifest";
 
@@ -134,6 +137,10 @@ bool UIAppValidation(const UIApplicationSingleEntry& item,
         "The multiple child element of ui-application element is obligatory";
     return false;
   }
+  if (multiple != kTrue && multiple != kFalse) {
+    *error = "multiple attribute should have 'true' or 'false' value";
+    return false;
+  }
 
   const std::string& nodisplay = item.app_info.nodisplay();
   if (nodisplay.empty()) {
@@ -142,6 +149,11 @@ bool UIAppValidation(const UIApplicationSingleEntry& item,
     return false;
   }
 
+  if (nodisplay != kTrue && nodisplay != kFalse) {
+    *error = "nodisplay attribute should have 'true' or 'false' value";
+    return false;
+  }
+
   const std::string& taskmanage = item.app_info.taskmanage();
   if (taskmanage.empty()) {
     *error =
@@ -150,6 +162,11 @@ bool UIAppValidation(const UIApplicationSingleEntry& item,
     return false;
   }
 
+  if (taskmanage != kTrue && taskmanage != kFalse) {
+    *error = "taskmanage attribute should have 'true' or 'false' value";
+    return false;
+  }
+
   const std::string& type = item.app_info.type();
   if (type.empty()) {
     *error =
index 2ffb4762cc818a000cd217da888e13ef52e18bc9..6f03c7cba7fb190df9e317a6ca000262c0106d61 100644 (file)
@@ -38,6 +38,9 @@ const char kWidgetApplicationNoDisplayKey[] = "@nodisplay";
 const char kWidgetApplicationHwAccelerationKey[] = "@hwacceleration";
 const char kWidgetApplicationKey[] = "manifest.widget-application";
 
+const char kTrue[] = "true";
+const char kFalse[] = "false";
+
 // manifest
 const char kManifestKey[] = "manifest";
 
@@ -127,12 +130,23 @@ bool WidgetAppValidation(const WidgetApplicationSingleEntry& item,
     return false;
   }
 
+  if (multiple != kTrue && multiple != kFalse) {
+    *error = "multiple attribute should have 'true' or 'false' value";
+    return false;
+  }
+
   const std::string& nodisplay = item.app_info.nodisplay();
   if (nodisplay.empty()) {
     *error = "The nodisplay child element of widget-application element "
         "is obligatory";
     return false;
   }
+
+  if (nodisplay != kTrue && nodisplay != kFalse) {
+    *error = "nodisplay attribute should have 'true' or 'false' value";
+    return false;
+  }
+
   return true;
 }