Fix GetPrivilegeListN() to support the web application.
authorhb.min <hb.min@samsung.com>
Wed, 12 Jun 2013 08:46:33 +0000 (17:46 +0900)
committerhb.min <hb.min@samsung.com>
Wed, 12 Jun 2013 08:46:33 +0000 (17:46 +0900)
Change-Id: I4937396c58dd41b9c8238f08a406036e53e48253
Signed-off-by: hb.min <hb.min@samsung.com>
src/security/FSec_PrivilegeManager.cpp

index d30b350..d6ce9ec 100644 (file)
 #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"
@@ -122,69 +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;
-       IEnumerator* pEnum = 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.");
-
-       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.");
-
-       r = privilegeInfo.GetBitwisePrivilegeN(pTargetBitwisePrivilege);
-       SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, 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.");
-
-       pEnum = pPrivilegeList->GetEnumeratorN();
-       SysTryCatch(NID_SEC,  pEnum != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
-
-       while (pEnum->MoveNext() == E_SUCCESS)
-       {
-               String* tempString = static_cast< String* >(pEnum->GetCurrent());
-               pReturnPrivilegeList->Add(new String(*tempString));
-       }
+       result r = E_SUCCESS;
+       int res = PMINFO_R_OK;
+       std::unique_ptr<ArrayList> pReturnPrivilegeList(null);
 
-       // fall through
+       pReturnPrivilegeList.reset(new (std::nothrow) ArrayList());
+       SysTryReturn(NID_SEC, pReturnPrivilegeList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
-CATCH:
+       r = pReturnPrivilegeList->Construct();
+       SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
-       if (pPrivilegeList != null)
-       {
-               pPrivilegeList->RemoveAll(true);
-               delete pPrivilegeList;
-       }
+       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.");
 
-       if (pTargetBitwisePrivilege)
-       {
-               free(pTargetBitwisePrivilege);
-               pTargetBitwisePrivilege = null;
-       }
+       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.");
 
-       if (pEnum)
-       {
-               delete pEnum;
-       }
+       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.");
 
-       return pReturnPrivilegeList;
+       return pReturnPrivilegeList.release();
 }
 
 result