From 52b443e4763ccd450373a25c48d60d910fc07388 Mon Sep 17 00:00:00 2001 From: Hyunbin Lee Date: Mon, 22 Apr 2013 09:33:16 +0900 Subject: [PATCH] Use security_server_app_give_access() API for updating smack rule Change-Id: Ia309e06e4a2ba3c8d55967d5f1839ff10653889e Signed-off-by: Hyunbin Lee --- packaging/osp-appfw.spec | 1 + src/CMakeLists.txt | 1 + src/app/FApp_AppArg.cpp | 6 +- src/app/FApp_AppImpl.cpp | 4 +- src/app/FApp_DataControlManager.cpp | 52 ++++++++++++++- src/app/FApp_DataControlManager.h | 8 +++ src/app/FApp_DataControlProviderManagerImpl.cpp | 89 +++++++++++++++++++++++-- src/app/FApp_DataControlProviderManagerImpl.h | 10 +++ src/app/FApp_MapDataControlImpl.cpp | 10 +-- src/app/FApp_SqlDataControlImpl.cpp | 37 ++++++++-- src/app/package/FAppPkg_PackageManagerImpl.cpp | 2 +- src/io/FIo_DataControlResultSetImpl.cpp | 21 ++++-- src/io/inc/FIo_DataControlResultSetImpl.h | 2 +- 13 files changed, 212 insertions(+), 31 deletions(-) diff --git a/packaging/osp-appfw.spec b/packaging/osp-appfw.spec index 2a07662..a3ce0ed 100755 --- a/packaging/osp-appfw.spec +++ b/packaging/osp-appfw.spec @@ -55,6 +55,7 @@ BuildRequires: pkgconfig(x11) BuildRequires: privacy-manager-client-devel BuildRequires: boost-devel BuildRequires: gettext-tools +BuildRequires: pkgconfig(security-server) # runtime requires Requires: capi-appfw-app-manager diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1bc491..19fac68 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,6 +39,7 @@ pkg_check_modules(pkgs REQUIRED capi-system-device capi-system-power capi-system-system-settings + security-server ) FOREACH(flag ${pkgs_CFLAGS}) diff --git a/src/app/FApp_AppArg.cpp b/src/app/FApp_AppArg.cpp index 9183760..c35521e 100755 --- a/src/app/FApp_AppArg.cpp +++ b/src/app/FApp_AppArg.cpp @@ -70,7 +70,7 @@ static const char OSP_V_REQUEST_TYPE_MAP_QEURY[] = "map_query"; static const char OSP_V_REQUEST_TYPE_MAP_INSERT[] = "map_insert"; static const char OSP_V_REQUEST_TYPE_MAP_UPDATE[] = "map_update"; static const char OSP_V_REQUEST_TYPE_MAP_DELETE[] = "map_delete"; -static const char OSP_V_VERSION_2_1_0_2[] = "ver_2.1.0.2"; +static const char OSP_V_VERSION_2_1_0_3[] = "ver_2.1.0.3"; static const char BUNDLE_KEY_PREFIX_AUL[] = "__AUL_"; static const char BUNDLE_KEY_PREFIX_SERVICE[] = "__APP_SVC_"; static const char BUNDLE_KEY_PREFIX_OSP[] = "__OSP_"; @@ -1030,7 +1030,7 @@ _AppArg::CreateSqlDataControlArg(bundle* b, const _SqlDataControlImpl& dc, _Data char dataControlRequestType[MAX_LEN_DATA_CONTROL_REQ_TYPE] = {0, }; snprintf(dataControlRequestType, MAX_LEN_DATA_CONTROL_REQ_TYPE, "%d", static_cast(requestType)); bundle_add(b, OSP_K_DATACONTROL_REQUEST_TYPE, dataControlRequestType); - bundle_add(b, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_2); + bundle_add(b, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_3); std::unique_ptr pProvider(_StringConverter::CopyToCharArrayN(dc.__providerId)); if (pProvider) @@ -1055,7 +1055,7 @@ _AppArg::CreateMapDataControlArg(bundle* b, const _MapDataControlImpl& dc, _Data char dataControlRequestType[MAX_LEN_DATA_CONTROL_REQ_TYPE] = {0, }; snprintf(dataControlRequestType, MAX_LEN_DATA_CONTROL_REQ_TYPE, "%d", static_cast < int >(requestType)); bundle_add(b, OSP_K_DATACONTROL_REQUEST_TYPE, dataControlRequestType); - bundle_add(b, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_2); + bundle_add(b, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_3); std::unique_ptr pProvider(_StringConverter::CopyToCharArrayN(dc.__providerId)); if (pProvider) diff --git a/src/app/FApp_AppImpl.cpp b/src/app/FApp_AppImpl.cpp index 1fad052..7b187c4 100644 --- a/src/app/FApp_AppImpl.cpp +++ b/src/app/FApp_AppImpl.cpp @@ -890,7 +890,7 @@ _AppImpl::OnDataControlRequestReceived(const _AppArg& arg, RequestId reqId) pInsertMap->Construct(); SysLog(NID_APP, "[DC_PROV_RECV] version: %ls", version.GetPointer()); - if (version == L"ver_2.1.0.2") + if (version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3") { pTmpPath = dynamic_cast< String* >(pList->GetAt(2)); // request list[2]: path SysTryCatch(NID_APP, pTmpPath != null, , E_SYSTEM, "[E_SYSTEM] invalid request"); @@ -981,7 +981,7 @@ _AppImpl::OnDataControlRequestReceived(const _AppArg& arg, RequestId reqId) pUpdateMap->Construct(); SysLog(NID_APP, "[DC_PROV_RECV] version: %ls", version.GetPointer()); - if (version == L"ver_2.1.0.2") + if (version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3") { pTmpPath = dynamic_cast< String* >(pList->GetAt(2)); // request list[2]: path SysTryCatch(NID_APP, pTmpPath != null, , E_SYSTEM, "[E_SYSTEM] invalid request"); diff --git a/src/app/FApp_DataControlManager.cpp b/src/app/FApp_DataControlManager.cpp index efb211c..aef876c 100644 --- a/src/app/FApp_DataControlManager.cpp +++ b/src/app/FApp_DataControlManager.cpp @@ -20,16 +20,21 @@ */ #include +#include #include #include #include #include +#include #include #include +#include +#include #include "FApp_DataControlManager.h" +using namespace std; using namespace Tizen::Base; using namespace Tizen::Base::Collection; @@ -40,17 +45,21 @@ _DataControlManager* _DataControlManager::__pDataControlManagerInstance = null; _DataControlManager::_DataControlManager(void) : __pDataControlRequestList(null) + , __pProviderList(null) , __uniqueId(-1) { __pDataControlRequestList = new (std::nothrow) HashMap(SingleObjectDeleter); SysTryReturnVoidResult(NID_APP, __pDataControlRequestList != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); - __pDataControlRequestList->Construct(); + + __pProviderList = new (std::nothrow) LinkedList(SingleObjectDeleter); + SysTryReturnVoidResult(NID_APP, __pProviderList != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); } _DataControlManager::~_DataControlManager(void) { delete __pDataControlRequestList; + delete __pProviderList; } void @@ -139,5 +148,46 @@ _DataControlManager::GetUniqueId(void) return __uniqueId; } +void +_DataControlManager::Cache(String& appId) +{ + __pProviderList->Add(new (std::nothrow) String(appId)); +} + +bool +_DataControlManager::IsCached(String& appId) +{ + unique_ptr< IEnumerator > pEnum(__pProviderList->GetEnumeratorN()); + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pCachedAppId = dynamic_cast< String* >(pEnum->GetCurrent()); + if (pCachedAppId != null && pCachedAppId->Equals(appId) == true) + { + return true; + } + } + return false; +} + +result +_DataControlManager::AllowAccess(String& appId) +{ + if (IsCached(appId) == false) + { + unique_ptr< char[] > pPkgId(_StringConverter::CopyToCharArrayN(appId)); + SysTryReturnResult(NID_APP, pPkgId != null, E_SYSTEM, "The method cannot proceed due to a severe system error."); + pPkgId.get()[10] = '\0'; + + int ret = security_server_app_give_access(pPkgId.get(), -1); + SysTryReturnResult(NID_APP, ret == 0, E_SYSTEM, + "Failed to call security_server_app_give_access(), provider: %s, ret: %d", pPkgId.get(), ret); + + Cache(appId); + } + + SysLog(NID_APP, "[DC_CALLER_SEND] Allow %ls to access", appId.GetPointer()); + return E_SUCCESS; +} + }} // Tizen::App diff --git a/src/app/FApp_DataControlManager.h b/src/app/FApp_DataControlManager.h index 7928c63..2d93675 100644 --- a/src/app/FApp_DataControlManager.h +++ b/src/app/FApp_DataControlManager.h @@ -24,6 +24,7 @@ #include #include +#include #include namespace Tizen { namespace App @@ -73,11 +74,17 @@ public: int GetUniqueId(void); + result AllowAccess(Tizen::Base::String& appId); + private: _DataControlManager(void); virtual ~_DataControlManager(void); + void Cache(Tizen::Base::String& appId); + + bool IsCached(Tizen::Base::String& appId); + static void InitSingleton(void); static void DestroySingleton(void); @@ -85,6 +92,7 @@ private: private: static _DataControlManager* __pDataControlManagerInstance; Tizen::Base::Collection::HashMap* __pDataControlRequestList; + Tizen::Base::Collection::LinkedList* __pProviderList; int __uniqueId; }; // _DataControlManager diff --git a/src/app/FApp_DataControlProviderManagerImpl.cpp b/src/app/FApp_DataControlProviderManagerImpl.cpp index f3f8264..0ecc416 100644 --- a/src/app/FApp_DataControlProviderManagerImpl.cpp +++ b/src/app/FApp_DataControlProviderManagerImpl.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -47,6 +48,7 @@ #include "FApp_SqlDataControlImpl.h" #include "FApp_MapDataControlImpl.h" #include "FApp_DataControlProviderManagerImpl.h" +#include "FApp_DataControlManager.h" using namespace std; using namespace Tizen::Base; @@ -54,6 +56,7 @@ using namespace Tizen::Base::Collection; using namespace Tizen::Io; extern const char* _DATACONTROL_RESULT_DIR; +extern const char* _DATACONTROL_RESULT_COMPAT_DIR; namespace Tizen { namespace App { @@ -104,6 +107,7 @@ _DataControlProviderManagerImpl::SendDataControlResult(RequestId reqId, _DataCon _AppArg resultArg; String* pDataId = null; result r = E_SUCCESS; + int ret = -1; _AppControlManager* pAppMgr = _AppControlManager::GetInstance(); SysTryReturnResult(NID_APP, pAppMgr, E_SYSTEM, "Failed to get instance."); @@ -185,11 +189,24 @@ _DataControlProviderManagerImpl::SendDataControlResult(RequestId reqId, _DataCon SysTryCatch(NID_APP, pResultSet, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); - r = pResultSet->FillWith(pDbEnum); + r = pResultSet->FillWith(pDbEnum, version); SysTryCatch(NID_APP, !IsFailed(r), , E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error."); - String tempFilePath(_DATACONTROL_RESULT_DIR); + String tempFilePath; + if (version == L"ver_2.1.0.3") + { + tempFilePath.Append(_DATACONTROL_RESULT_DIR); + + DataControlProviderManager* pDcMgr = DataControlProviderManager::GetInstance(); + SysTryCatch(NID_APP, pDcMgr != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get DataControlProviderManager instance."); + r = pDcMgr->__pDataControlProviderManagerImpl->AllowAccess(callerAppId); + SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); + } + else + { + tempFilePath.Append(_DATACONTROL_RESULT_COMPAT_DIR); + } tempFilePath.Append(callerAppId); tempFilePath.Append(callerReqId); pTempFilePath = new (std::nothrow) String(tempFilePath); @@ -247,9 +264,17 @@ _DataControlProviderManagerImpl::SendDataControlResult(RequestId reqId, _DataCon long long argSize = 0; if (addItemCount > 0) { - if (version == L"ver_2.1.0.1" || version == L"ver_2.1.0.2") + if (version == L"ver_2.1.0.1" || version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3") { - String tempFilePath(_DATACONTROL_RESULT_DIR); + String tempFilePath; + if (version == L"ver_2.1.0.3") + { + tempFilePath.Append(_DATACONTROL_RESULT_DIR); + } + else + { + tempFilePath.Append(_DATACONTROL_RESULT_COMPAT_DIR); + } tempFilePath.Append(callerAppId); tempFilePath.Append(callerReqId); pTempFilePath = new (std::nothrow) String(tempFilePath); @@ -281,6 +306,14 @@ _DataControlProviderManagerImpl::SendDataControlResult(RequestId reqId, _DataCon SysTryCatch(NID_APP, !IsFailed(r), , E_SYSTEM, "[%s] Failed to send result.", GetErrorMessage(r)); } pFile->Flush(); + + if (version == L"ver_2.1.0.3") + { + DataControlProviderManager* pDcMgr = DataControlProviderManager::GetInstance(); + SysTryCatch(NID_APP, pDcMgr != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get DataControlProviderManager instance."); + r = pDcMgr->__pDataControlProviderManagerImpl->AllowAccess(callerAppId); + SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); + } } else { @@ -399,14 +432,58 @@ _DataControlProviderManagerImpl::GetInstance(void) return pDcMgr; } -// private +void +_DataControlProviderManagerImpl::Cache(String& appId) +{ + __pProviderList->Add(new (std::nothrow) String(appId)); +} + +bool +_DataControlProviderManagerImpl::IsCached(String& appId) +{ + unique_ptr< IEnumerator > pEnum(__pProviderList->GetEnumeratorN()); + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pCachedAppId = dynamic_cast< String* >(pEnum->GetCurrent()); + if (pCachedAppId != null && pCachedAppId->Equals(appId) == true) + { + return true; + } + } + return false; +} + +result +_DataControlProviderManagerImpl::AllowAccess(String& appId) +{ + if (IsCached(appId) == false) + { + unique_ptr< char[] > pPkgId(_StringConverter::CopyToCharArrayN(appId)); + SysTryReturnResult(NID_APP, pPkgId != null, E_SYSTEM, "The method cannot proceed due to a severe system error."); + pPkgId.get()[10] = '\0'; + + int ret = security_server_app_give_access(pPkgId.get(), -1); + SysTryReturnResult(NID_APP, ret == 0, E_SYSTEM, + "Failed to call security_server_app_give_access(), provider: %s, ret: %d", pPkgId.get(), ret); + + Cache(appId); + } + + SysLog(NID_APP, "[DC_PROV_SEND] Allow %ls to access", appId.GetPointer()); + return E_SUCCESS; +} + _DataControlProviderManagerImpl::_DataControlProviderManagerImpl(void) + : __pProviderList(null) { + __pProviderList = new (std::nothrow) LinkedList(SingleObjectDeleter); + SysTryReturnVoidResult(NID_APP, __pProviderList != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); } _DataControlProviderManagerImpl::~_DataControlProviderManagerImpl(void) { + delete __pProviderList; } -} } // Tizen::App +}} // Tizen::App diff --git a/src/app/FApp_DataControlProviderManagerImpl.h b/src/app/FApp_DataControlProviderManagerImpl.h index b05e7d0..90c27e1 100644 --- a/src/app/FApp_DataControlProviderManagerImpl.h +++ b/src/app/FApp_DataControlProviderManagerImpl.h @@ -28,6 +28,7 @@ #include #include #include +#include #include "FApp_AppArg.h" @@ -72,6 +73,8 @@ public: result SendDataControlError(RequestId reqId, const Tizen::Base::String& errorMsg); + result AllowAccess(Tizen::Base::String& appId); + /** * Retrieves the data control provider manager instance. * @@ -106,10 +109,17 @@ private: */ _DataControlProviderManagerImpl& operator =(const _DataControlProviderManagerImpl& source); + void Cache(Tizen::Base::String& appId); + + bool IsCached(Tizen::Base::String& appId); + static result SendDataControlResult(RequestId reqId, _DataControlRequestType apiType, Tizen::Io::IDbEnumerator* pDbEnum, Tizen::Base::Collection::IList* pResultValueList, long long insertRowId, bool providerResult, const Tizen::Base::String* pErrorMsg); +private: + Tizen::Base::Collection::LinkedList* __pProviderList; + friend class DataControlProviderManager; }; diff --git a/src/app/FApp_MapDataControlImpl.cpp b/src/app/FApp_MapDataControlImpl.cpp index 27df400..b03b54a 100755 --- a/src/app/FApp_MapDataControlImpl.cpp +++ b/src/app/FApp_MapDataControlImpl.cpp @@ -263,7 +263,7 @@ _MapDataControlImpl::GetValue(const String& dataId, const String& key, long long argSize = dataId.GetLength() * sizeof(wchar_t); argSize += key.GetLength() * sizeof(wchar_t); SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); pPageNo = new (std::nothrow) String(); pPageNo->Append(pageNo); @@ -401,7 +401,7 @@ _MapDataControlImpl::MapDataControlCallback(void* data, _AppArg* pArg, _AppArg* if (resultCount > 0) { - if (version == L"ver_2.1.0.1" || version == L"ver_2.1.0.2") + if (version == L"ver_2.1.0.1" || version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3") { pPath = dynamic_cast< String* >(pResultList->GetAt(3)); // result list[3] SysTryCatch(NID_APP, pPath, delete pResultValueList, E_SYSTEM, "[E_SYSTEM] invalid result"); @@ -542,7 +542,7 @@ _MapDataControlImpl::AddValue(const String& dataId, const String& key, argSize += key.GetLength() * sizeof(wchar_t); argSize += value.GetLength() * sizeof(wchar_t); SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); r = StartMapDataControl(_DATACONTROL_REQUEST_TYPE_MAP_INSERT, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); @@ -583,7 +583,7 @@ _MapDataControlImpl::SetValue(const String& dataId, const String& key, argSize += oldValue.GetLength() * sizeof(wchar_t); argSize += newValue.GetLength() * sizeof(wchar_t); SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); r = StartMapDataControl(_DATACONTROL_REQUEST_TYPE_MAP_UPDATE, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); @@ -622,7 +622,7 @@ _MapDataControlImpl::RemoveValue(const String& dataId, const String& key, argSize += key.GetLength() * sizeof(wchar_t); argSize += value.GetLength() * sizeof(wchar_t); SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); r = StartMapDataControl(_DATACONTROL_REQUEST_TYPE_MAP_DELETE, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); diff --git a/src/app/FApp_SqlDataControlImpl.cpp b/src/app/FApp_SqlDataControlImpl.cpp index 40f2003..2b2abeb 100755 --- a/src/app/FApp_SqlDataControlImpl.cpp +++ b/src/app/FApp_SqlDataControlImpl.cpp @@ -44,16 +44,19 @@ #include "FApp_SqlDataControlImpl.h" #include "FApp_AppArg.h" #include "FApp_DataControlManager.h" +#include "FAppPkg_PackageManagerImpl.h" #define DATACONTROL_PROTOCOL_VER_2_1_0_2 // ver_2.1.0.2 +#define DATACONTROL_PROTOCOL_VER_2_1_0_3 // ver_2.1.0.3 using namespace std; using namespace Tizen::Base; using namespace Tizen::Base::Collection; using namespace Tizen::Base::Runtime; -using namespace Tizen::App; using namespace Tizen::Io; +using namespace Tizen::App; +using namespace Tizen::App::Package; namespace Tizen { namespace App { @@ -62,7 +65,8 @@ static const int MAX_REQUEST_COUNT = 128; static const int REQUEST_THRESHOLD = 100; static const int _MAX_ARGUMENT_SIZE = 16384; // 16KB static const int _MAX_REQUEST_ARGUMENT_SIZE = 1048576; // 1MB -static const char* _DATACONTROL_REQUEST_DIR = "/tmp/osp/DataControlRequest/\0"; +//static const char* _DATACONTROL_REQUEST_DIR = "/tmp/osp/DataControlRequest/\0"; +static const char* _DATACONTROL_REQUEST_DIR = "/tmp/osp/data-control/request/\0"; class _SqlDataControlEventArg : public IEventArg @@ -318,7 +322,7 @@ _SqlDataControlImpl::Select(const String& dataId, const IList* pColumnList, cons pArgList->Add(*(new String(L"NULL"))); } SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); pArgList->Add(*(new String(Integer::ToString(pageNo)))); // list(5): page number @@ -540,6 +544,8 @@ _SqlDataControlImpl::Insert(const String& dataId, const IMap& insertMap, Request int uniqueId = -1; File request; IMapEnumerator* pMapEnum = null; + _PackageManagerImpl* pPkgMgrImpl = null; + unique_ptr< String > pProviderAppId(null); result r = E_SUCCESS; SysLog(NID_APP, "[DC_CALLER_SEND] SqlDataControl INSERT"); @@ -635,11 +641,19 @@ _SqlDataControlImpl::Insert(const String& dataId, const IMap& insertMap, Request #endif } SysTryCatch(NID_APP, argSize <= _MAX_REQUEST_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); #ifdef DATACONTROL_PROTOCOL_VER_2_1_0_2 request.Flush(); #endif +#ifdef DATACONTROL_PROTOCOL_VER_2_1_0_3 + pPkgMgrImpl = _PackageManagerImpl::GetInstance(); + pProviderAppId.reset(pPkgMgrImpl->GetAppIdOfDataControlN(this->__providerId.GetPointer())); + SysTryCatch(NID_APP, pProviderAppId != null, r = E_SYSTEM, E_SYSTEM, + "[E_SYSTEM] The method cannot proceed due to a severe system error."); + r = pDcMgr->AllowAccess(*(pProviderAppId.get())); + SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); +#endif r = StartSqlDataControl(_DATACONTROL_REQUEST_TYPE_SQL_INSERT, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); @@ -669,6 +683,8 @@ _SqlDataControlImpl::Update(const String& dataId, const IMap& updateMap, const S int uniqueId = -1; File request; IMapEnumerator* pMapEnum = null; + _PackageManagerImpl* pPkgMgrImpl = null; + unique_ptr< String > pProviderAppId(null); result r = E_SUCCESS; SysLog(NID_APP, "[DC_CALLER_SEND] SqlDataControl UPDATE"); @@ -779,7 +795,16 @@ _SqlDataControlImpl::Update(const String& dataId, const IMap& updateMap, const S pArgList->Add(new (std::nothrow) String(L"NULL")); } SysTryCatch(NID_APP, argSize <= _MAX_REQUEST_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); + +#ifdef DATACONTROL_PROTOCOL_VER_2_1_0_3 + pPkgMgrImpl = _PackageManagerImpl::GetInstance(); + pProviderAppId.reset(pPkgMgrImpl->GetAppIdOfDataControlN(this->__providerId.GetPointer())); + SysTryCatch(NID_APP, pProviderAppId != null, r = E_SYSTEM, E_SYSTEM, + "[E_SYSTEM] The method cannot proceed due to a severe system error."); + r = pDcMgr->AllowAccess(*(pProviderAppId.get())); + SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); +#endif r = StartSqlDataControl(_DATACONTROL_REQUEST_TYPE_SQL_UPDATE, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); @@ -825,7 +850,7 @@ _SqlDataControlImpl::Delete(const String& dataId, const String* pWhere, RequestI pArgList->Add(*(new String(L"NULL"))); } SysTryCatch(NID_APP, argSize <= _MAX_ARGUMENT_SIZE, r = E_MAX_EXCEEDED, E_MAX_EXCEEDED, - "[E_MAX_EXCEEDED] The size of sending argument (%d) exceeds the maximum limit.", argSize); + "[E_MAX_EXCEEDED] The size of sending argument (%lld) exceeds the maximum limit.", argSize); r = StartSqlDataControl(_DATACONTROL_REQUEST_TYPE_SQL_DELETE, pArgList, &id); SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); diff --git a/src/app/package/FAppPkg_PackageManagerImpl.cpp b/src/app/package/FAppPkg_PackageManagerImpl.cpp index dd43f65..e729e03 100755 --- a/src/app/package/FAppPkg_PackageManagerImpl.cpp +++ b/src/app/package/FAppPkg_PackageManagerImpl.cpp @@ -1719,7 +1719,7 @@ _PackageManagerImpl::GetAppIdOfDataControlN(const String& providerId) String query; String* pAppId = null; - query.Format(1024, L"SELECT PkgInfo.PKG_ID FROM PkgInfo, AppInfo, DataControl WHERE DataControl.PROVIDER_ID = '%ls' and DataControl.ID = AppInfo.UNIQUE_ID and AppInfo.ID = PkgInfo.UNIQUE_ID", + query.Format(1024, L"SELECT AppInfo.PACKAGE_NAME FROM AppInfo, DataControl WHERE DataControl.PROVIDER_ID = '%ls' and DataControl.ID = AppInfo.UNIQUE_ID", providerId.GetPointer()); r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r"); diff --git a/src/io/FIo_DataControlResultSetImpl.cpp b/src/io/FIo_DataControlResultSetImpl.cpp index bec91c5..1378cdc 100644 --- a/src/io/FIo_DataControlResultSetImpl.cpp +++ b/src/io/FIo_DataControlResultSetImpl.cpp @@ -49,7 +49,8 @@ using namespace Tizen::Base::Utility; using namespace Tizen::Base::Collection; using namespace Tizen::App; -const char* _DATACONTROL_RESULT_DIR = "/tmp/osp/DataControlResult/\0"; +const char* _DATACONTROL_RESULT_DIR = "/tmp/osp/data-control/result/\0"; +const char* _DATACONTROL_RESULT_COMPAT_DIR = "/tmp/osp/DataControlResult/\0"; namespace Tizen { namespace Io { @@ -85,11 +86,11 @@ _DataControlResultSetImpl::~_DataControlResultSetImpl(void) // [sizeof(int)] size // [ varient ] content result -_DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum) +_DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum, String& version) { - String tempFilePath(_DATACONTROL_RESULT_DIR); + String tempFilePath; String columnName; - String appId; + String callerAppId; String reqType; String callerReqId; String* pNo = null; @@ -126,7 +127,7 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum) SysTryReturnResult(NID_IO, requestType == _DATACONTROL_REQUEST_TYPE_SQL_QUERY, E_INVALID_ARG, "The reqId should be for the data control query request."); - appId = arg.GetCallerAppId(); + callerAppId = arg.GetCallerAppId(); callerReqId = arg.GetValue(OSP_K_REQUEST_ID); // list-based request @@ -148,7 +149,15 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum) Integer::Parse(*pCount, countPerPage); this->SetCapacity(pageNo, countPerPage); - tempFilePath.Append(appId); + if (version == L"ver_2.1.0.3") + { + tempFilePath.Append(_DATACONTROL_RESULT_DIR); + } + else + { + tempFilePath.Append(_DATACONTROL_RESULT_COMPAT_DIR); + } + tempFilePath.Append(callerAppId); tempFilePath.Append(callerReqId); __tmpPath = tempFilePath; SysSecureLog(NID_IO, "[DC_PROV_SEND] temp file path: %ls", tempFilePath.GetPointer()); diff --git a/src/io/inc/FIo_DataControlResultSetImpl.h b/src/io/inc/FIo_DataControlResultSetImpl.h index 6ede5ec..d6f5946 100644 --- a/src/io/inc/FIo_DataControlResultSetImpl.h +++ b/src/io/inc/FIo_DataControlResultSetImpl.h @@ -81,7 +81,7 @@ public: * - An unexpected device failure has occurred as the media ejected suddenly. * - Detected corruption of a file. */ - result FillWith(IDbEnumerator* pDbEnum); + result FillWith(IDbEnumerator* pDbEnum, Tizen::Base::String& version); private: /** -- 2.7.4