#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"
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