Merge "Fixed Klocworks issues" into tizen_2.2
[platform/framework/native/appfw.git] / src / security / FSec_PrivilegeManager.cpp
index 2e2e3d2..441e44c 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
 #include <stdlib.h>
 #include <pthread.h>
 #include <unique_ptr.h>
+#include <pkgmgr-info.h>
 #include <FAppPkg_PackageInfoImpl.h>
 #include <FAppPkg_PackageManagerImpl.h>
 #include <FBaseString.h>
 #include <FBaseSysLog.h>
+#include <FBase_StringConverter.h>
 #include <FIo_IpcClient.h>
 #include "FSec_AccessControlTypes.h"
 #include "FSec_PrivilegeManager.h"
@@ -123,54 +124,42 @@ _PrivilegeManager::GetInstance(void)
     return __pPrivilegeManagerInstance;
 }
 
+int GetPrivilegeListCallback (const char *privilege_name, void *user_data)
+{
+       ArrayList* pPrivilegeList = static_cast<ArrayList*>(user_data);
+       pPrivilegeList->Add(new String(privilege_name));
+
+       return 0;
+}
 
 IList*
 _PrivilegeManager::GetPrivilegeListN(const AppId& appId)
 {
-       result r = E_SUCCESS;
-       _PrivilegeInfo privilegeInfo;
-       byte* pTargetBitwisePrivilege = null;
-       IList* pReturnPrivilegeList = null;
-       String encryptedPrivileges;
-       String checksum;
-       ArrayList* pPrivilegeList = null;
-
        ClearLastResult();
 
-       r = RetrieveCipherPrivilegeN(appId, encryptedPrivileges, checksum, pPrivilegeList);
-       if (r == E_DATA_NOT_FOUND)
-       {
-               SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
-               return null;
-       }
-       SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       result r = E_SUCCESS;
+       int res = PMINFO_R_OK;
+       std::unique_ptr<ArrayList> pReturnPrivilegeList(null);
 
-       r = privilegeInfo.Construct(appId, encryptedPrivileges, checksum, pPrivilegeList);
-       SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       pReturnPrivilegeList.reset(new (std::nothrow) ArrayList());
+       SysTryReturn(NID_SEC, pReturnPrivilegeList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
-       r = privilegeInfo.GetBitwisePrivilegeN(pTargetBitwisePrivilege);
-       SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       r = pReturnPrivilegeList->Construct();
+       SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
-       pReturnPrivilegeList = UnpackPrivilegeN(pTargetBitwisePrivilege);
-       SysTryCatch(NID_SEC,  pReturnPrivilegeList != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       std::unique_ptr<char[]> pPackageId(null);
+       pPackageId.reset(_StringConverter::CopyToCharArrayN(appId));
+       SysTryReturn(NID_SEC, pPackageId != null, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
-       // fall through
+       pkgmgrinfo_pkginfo_h handle;
+       res = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &handle);
+       SysTryReturn(NID_SEC, res == PMINFO_R_OK, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
-CATCH:
+       res = pkgmgrinfo_pkginfo_foreach_privilege(handle, GetPrivilegeListCallback, pReturnPrivilegeList.get());
+       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+       SysTryReturn(NID_SEC, res == PMINFO_R_OK, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
-       if (pPrivilegeList != null)
-       {
-               pPrivilegeList->RemoveAll(true);
-               delete pPrivilegeList;
-       }
-
-       if (pTargetBitwisePrivilege)
-       {
-               free(pTargetBitwisePrivilege);
-               pTargetBitwisePrivilege = null;
-       }
-
-       return pReturnPrivilegeList;
+       return pReturnPrivilegeList.release();
 }
 
 result
@@ -202,7 +191,10 @@ _PrivilegeManager::RetrieveCipherPrivilegeN(const AppId& appId, Tizen::Base::Str
        pPrivilegeList = new ArrayList;
        r = pPrivilegeList->Construct();
 
-       IEnumerator* pEnum = tempPrivilegeList.GetEnumeratorN();
+       std::unique_ptr<IEnumerator> pEnum(null);
+       pEnum.reset(tempPrivilegeList.GetEnumeratorN());
+       SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred.");
+
        while (pEnum->MoveNext() == E_SUCCESS)
        {
                String* tempString = static_cast< String* >(pEnum->GetCurrent());
@@ -256,7 +248,10 @@ _PrivilegeManager::RetrieveCipherPrivilegeExN(const AppId& appId, Tizen::Base::S
        pPrivilegeList = new ArrayList;
        r = pPrivilegeList->Construct();
 
-       IEnumerator* pEnum = tempPrivilegeList.GetEnumeratorN();
+       std::unique_ptr<IEnumerator> pEnum(null);
+       pEnum.reset(tempPrivilegeList.GetEnumeratorN());
+       SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred.");
+
        while (pEnum->MoveNext() == E_SUCCESS)
        {
                String* tempString = static_cast< String* >(pEnum->GetCurrent());