From: Pawel Kaczmarczyk Date: Fri, 6 Apr 2018 13:17:11 +0000 (+0200) Subject: [Contact] Synchronously checking access to file X-Git-Tag: submit/tizen/20180427.125243~5^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F85%2F175085%2F4;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Contact] Synchronously checking access to file ACR: http://suprem.sec.samsung.net/jira/browse/TWDAPI-187 [Verification] Tested in Chromium console tct-contact-tizen-tests passrate: 100% Change-Id: Ie0e1ee09737b37174511e1e30e5ba0e40cdcbc94 Signed-off-by: Pawel Kaczmarczyk --- diff --git a/src/contact/contact_instance.cc b/src/contact/contact_instance.cc index 0b58bd8e..939aaf07 100644 --- a/src/contact/contact_instance.cc +++ b/src/contact/contact_instance.cc @@ -17,6 +17,7 @@ #include "contact/contact_instance.h" #include "common/converter.h" +#include "common/filesystem/filesystem_provider.h" #include "common/logger.h" #include "common/platform_exception.h" #include "common/task-queue.h" @@ -32,7 +33,31 @@ namespace contact { namespace { const std::string kPrivilegeContactRead = "http://tizen.org/privilege/contact.read"; const std::string kPrivilegeContactWrite = "http://tizen.org/privilege/contact.write"; -} +const std::vector kContactURIs = {"photoURI", "ringtoneURI", "vibrationURI", + "messageAlertURI"}; +const std::vector kPersonGroupURIs = {"photoURI", "ringtoneURI"}; +const std::vector kOrganizationURIs = {"logoURI"}; +} + +#define CHECK_CONTACT_ATTRIBUTES_STORAGE(in, to_check, out) \ + do { \ + for (auto& attr : to_check) { \ + if (!IsNull(in, attr)) { \ + const std::string& real_path = \ + common::FilesystemProvider::Create().GetRealPath(FromJson(in, attr)); \ + CHECK_STORAGE_ACCESS(real_path, out); \ + } \ + } \ + } while (0); + +#define CHECK_CONTACT_ATTRIBUTES_ARRAY(in, attribute, to_check, out) \ + do { \ + JsonArray array = FromJson(in, attribute); \ + for (auto& el : array) { \ + JsonObject element = common::JsonCast(el); \ + CHECK_CONTACT_ATTRIBUTES_STORAGE(element, to_check, out); \ + } \ + } while (0); using namespace common; @@ -110,6 +135,11 @@ void ContactInstance::AddressBookGet(const JsonValue& args, JsonObject& out) { void ContactInstance::AddressBookAdd(const JsonValue& args, JsonObject& out) { ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + + const auto& contact = args.get("contact").get(); + CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out); + CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out); + JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookAdd(common::JsonCast(args), val.get()); @@ -123,6 +153,13 @@ void ContactInstance::AddressBookAddBatch(const JsonValue& args, JsonObject& out ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + const auto& batch_args = args.get("batchArgs").get(); + for (auto& item : batch_args) { + JsonObject contact = common::JsonCast(item); + CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out); + CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out); + } + const double callback_id = args.get("callbackId").get(); auto get = [=](const std::shared_ptr& response) -> void { @@ -180,6 +217,13 @@ void ContactInstance::AddressBookUpdateBatch(const JsonValue& args, JsonObject& ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + const auto& batch_args = args.get("batchArgs").get(); + for (auto& item : batch_args) { + JsonObject contact = common::JsonCast(item); + CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out); + CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out); + } + const double callback_id = args.get("callbackId").get(); auto get = [=](const std::shared_ptr& response) -> void { @@ -208,6 +252,11 @@ void ContactInstance::AddressBookUpdateBatch(const JsonValue& args, JsonObject& void ContactInstance::AddressBookUpdate(const JsonValue& args, JsonObject& out) { ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + + const auto& contact = args.get("contact").get(); + CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out); + CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out); + JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookUpdate(common::JsonCast(args), val.get()); @@ -260,6 +309,10 @@ void ContactInstance::AddressBookFind(const JsonValue& args, JsonObject& out) { void ContactInstance::AddressBookAddGroup(const JsonValue& args, JsonObject& out) { ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + + const auto& group = args.get("group").get(); + CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out); + JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookAddGroup(common::JsonCast(args), val.get()); @@ -283,6 +336,10 @@ void ContactInstance::AddressBookGetGroup(const JsonValue& args, JsonObject& out void ContactInstance::AddressBookUpdateGroup(const JsonValue& args, JsonObject& out) { ScopeLogger(); + + const auto& group = args.get("group").get(); + CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out); + CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookUpdateGroup(common::JsonCast(args), @@ -421,6 +478,10 @@ void ContactInstance::ContactManagerGet(const JsonValue& args, JsonObject& out) void ContactInstance::ContactManagerUpdate(const JsonValue& args, JsonObject& out) { ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + + const auto& group = args.get("person").get(); + CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out); + JsonValue val{JsonObject{}}; PlatformResult status = ContactManager::ContactManagerUpdate(common::JsonCast(args), val.get()); @@ -434,6 +495,12 @@ void ContactInstance::ContactManagerUpdateBatch(const JsonValue& args, JsonObjec ScopeLogger(); CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out); + const auto& batch_args = args.get("batchArgs").get(); + for (auto& item : batch_args) { + JsonObject contact = common::JsonCast(item); + CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kPersonGroupURIs, &out); + } + const double callback_id = args.get("callbackId").get(); auto get = [=](const std::shared_ptr& response) -> void { @@ -640,6 +707,8 @@ void ContactInstance::PersonResetUsageCount(const JsonValue& args, JsonObject& o } else { LogAndReportError(status, &out); } +#undef CHECK_CONTACT_ATTRIBUTES_STORAGE +#undef CHECK_CONTACT_ATTRIBUTES_ARRAY } } // namespace contact