From 9568c8d0ac268199c468f04fd4effe3fd743578a Mon Sep 17 00:00:00 2001 From: Lomtev Dmytro Date: Wed, 13 Sep 2017 15:17:09 +0300 Subject: [PATCH] DeleteAppFunc updated to conform NM_deleteApp prototype. For demo: Added block of amazon VM IP. --- tv-widget/proxy/inc/network/network_manager.h | 2 +- tv-widget/proxy/inc/network/nm_types.h | 1 + tv-widget/proxy/inc/utils/json_utils.h | 2 + tv-widget/proxy/src/network/network_manager.cpp | 72 +++++++++++++++++++++++-- tv-widget/proxy/src/utils/json_utils.cpp | 61 +++++++++++++++++++++ 5 files changed, 134 insertions(+), 4 deletions(-) diff --git a/tv-widget/proxy/inc/network/network_manager.h b/tv-widget/proxy/inc/network/network_manager.h index 009e035..edc296a 100644 --- a/tv-widget/proxy/inc/network/network_manager.h +++ b/tv-widget/proxy/inc/network/network_manager.h @@ -50,7 +50,7 @@ public: typedef NM_ErrorCode (*GetDevicePolicyFunc)(NM_hContext, const char* devId, const char * agentId, char** policy); typedef NM_ErrorCode (*SetDevicePolicyFunc)(NM_hContext, const char* devId, const char* policy); typedef NM_ErrorCode (*GetDeviceAgentsFunc)(NM_hContext, const char* devId, char** agents); - typedef NM_ErrorCode (*DeleteAppFunc)(NM_hContext ctx, const char* dev_id, const char* app_name); + typedef NM_ErrorCode (*DeleteAppFunc)(NM_hContext ctx, const char* dev_id, const char* parentUuid, const char* app_name); public: NetworkManager(); diff --git a/tv-widget/proxy/inc/network/nm_types.h b/tv-widget/proxy/inc/network/nm_types.h index af0dafd..f5b306d 100644 --- a/tv-widget/proxy/inc/network/nm_types.h +++ b/tv-widget/proxy/inc/network/nm_types.h @@ -102,6 +102,7 @@ typedef struct const char* duid; const char* policy; const char* appname; + const char* parentUuid; CallbackState callbackState; } NM_NotificationData; diff --git a/tv-widget/proxy/inc/utils/json_utils.h b/tv-widget/proxy/inc/utils/json_utils.h index c42cefb..15b5b51 100644 --- a/tv-widget/proxy/inc/utils/json_utils.h +++ b/tv-widget/proxy/inc/utils/json_utils.h @@ -24,6 +24,8 @@ JSONNode ToJson(const DevicePtr& device); JSONNode ToJson(const DeviceList& deviceList); +bool PolicyGroupAddSiteBlock(JSONNode& policyGroup, const std::string& site); + } diff --git a/tv-widget/proxy/src/network/network_manager.cpp b/tv-widget/proxy/src/network/network_manager.cpp index 23f650e..bc3c4e4 100644 --- a/tv-widget/proxy/src/network/network_manager.cpp +++ b/tv-widget/proxy/src/network/network_manager.cpp @@ -19,6 +19,7 @@ #include "utils/log.h" #include "utils/to_string.h" #include "utils/assert_return.h" +#include "utils/json_utils.h" #include @@ -308,18 +309,83 @@ void NetworkManager::PushNotificationCallback(NM_NotificationData data, void* us { std::string device_id{data.duid}; std::string app_name{data.appname}; - nm->m_pushNotification->setHandler([nm, device_id, app_name](int button_index){ + std::string parentUuid{data.parentUuid}; + nm->m_pushNotification->setHandler([nm, device_id, parentUuid, app_name](int button_index){ LOG_INFO("notification handler : button_index [%d]", button_index); if(button_index == 0) { - LOG_INFO("try to uninstall application [%s], device_id [%s]", app_name.c_str(), device_id.c_str()); + LOG_INFO("try to uninstall application [%s], device_id [%s], parent device [%s]", + app_name.c_str(), device_id.c_str(), parentUuid.c_str()); - if(nm->m_moduleSymbols.m_nmDeleteAppFunc(nm->m_context, device_id.c_str(), app_name.c_str()) == NM_ErrorCode::EC_OK) + NM_ErrorCode delErr = nm->m_moduleSymbols.m_nmDeleteAppFunc(nm->m_context, + device_id.c_str(), + parentUuid.c_str(), + app_name.c_str()); + + if(delErr == NM_ErrorCode::EC_OK) + { LOG_INFO("application uninstalled"); + } else + { LOG_ERR("failed to uninstall application"); + } + + std::string policy; + int policyRes = nm->GetDevicePolicy(device_id, policy); + + if (policyRes != NM_ErrorCode::EC_OK) + { + LOG_ERR("failed to get policy, error code: %d", policyRes); + } + else + { + LOG_INFO("get policy successful"); + } + + try + { + JSONNode parsed_policy = libjson::parse(policy); + const std::string site_to_block{"*:52.71.167.178:*"}; + bool block_added = false; + + if (JSON_ARRAY == parsed_policy.type()) + { + for (auto it = parsed_policy.begin(); it != parsed_policy.end(); ++it) + { + block_added = PolicyGroupAddSiteBlock(*it, site_to_block); + } + } + else + { + block_added = PolicyGroupAddSiteBlock(parsed_policy, site_to_block); + } + + if (block_added) + { + parsed_policy.preparse(); + LOG_DBG("Policy to set: %s", parsed_policy.write().c_str()); + + if ((policyRes = nm->SetDevicePolicy(device_id, parsed_policy.write())) != NM_ErrorCode::EC_OK) + { + LOG_ERR("failed to set policy, error code: %d", policyRes); + } + else + { + LOG_INFO("set policy successful"); + } + } + else + { + LOG_ERR("Site block not set"); + } + } + catch(std::exception& e) + { + LOG_ERR("Site block exception: %s", e.what()); + } } }); nm->m_pushNotification->push(data.title, data.message, "Uninstall", "Cancel"); diff --git a/tv-widget/proxy/src/utils/json_utils.cpp b/tv-widget/proxy/src/utils/json_utils.cpp index b1ecd46..4174055 100644 --- a/tv-widget/proxy/src/utils/json_utils.cpp +++ b/tv-widget/proxy/src/utils/json_utils.cpp @@ -10,6 +10,7 @@ **/ #include "utils/json_utils.h" +#include "utils/log.h" namespace iotswsec { @@ -40,5 +41,65 @@ JSONNode ToJson(const DeviceList& deviceList) return json; } +static bool AlreadyHasIt(JSONNode& items_array, const std::string& site) +{ + //TODO: implement more sophisticated checking algorithm + for (auto record_it = items_array.begin(); record_it != items_array.end(); ++record_it) + { + if (record_it->as_string() == site) + { + return true; + } + } + + return false; +} + +bool PolicyGroupAddSiteBlock(JSONNode& policyGroup, const std::string& site) +{ + LOG_DBG("BEGIN"); + + bool result = false; + + auto policies_it = policyGroup.find("policies"); + + if (policies_it != policyGroup.end()) + { + for (auto policy_it = policies_it->begin(); policy_it != policies_it->end(); ++policy_it) + { + auto name_it = policy_it->find("name"); + + if (name_it != policy_it->end() && name_it->as_string() == "iptables") + { + auto items_it = policy_it->find("items"); + + if (items_it == policy_it->end()) + { + JSONNode items = JSONNode(JSON_ARRAY); + items.set_name("items"); + items.push_back(JSONNode("", site)); + policy_it->push_back(items); + } + else + { + if (!AlreadyHasIt(*items_it, site)) + { + items_it->push_back(JSONNode("", site)); + } + } + + result = true; + break; + } + } + } + else + { + LOG_ERR("Malformed JSON (Policy Group without policies field): %s", policyGroup.write().c_str()); + } + + return result; +} + } -- 2.7.4