//
-// 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"
#include "FSec_PrivilegeCache.h"
#include "FSec_PrivilegeInfo.h"
-
using namespace Tizen::App;
using namespace Tizen::App::Package;
using namespace Tizen::Base;
{
result r = E_SUCCESS;
- SysLog(NID_SEC, "Enter.");
-
_PackageManagerImpl* pPackageManagerImpl = null;
pPackageManagerImpl = _PackageManagerImpl::GetInstance();
r = __pPrivilegeCache->Construct();
SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
- SysLog(NID_SEC, "Exit.");
return r;
CATCH:
delete __pPrivilegeCache;
-
- SysLog(NID_SEC, "Exit.");
return r;
}
result r = E_SUCCESS;
static _PrivilegeManager instance;
- SysLog(NID_SEC, "Enter");
ClearLastResult();
r = instance.Construct();
__pPrivilegeManagerInstance = &instance;
- SysLog(NID_SEC, "Exit");
+ return;
}
_PrivilegeManager*
result r = E_SUCCESS;
static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
- SysLog(NID_SEC, "Enter");
ClearLastResult();
if (__pPrivilegeManagerInstance == null)
}
}
- SysLog(NID_SEC, "Exit");
-
- return __pPrivilegeManagerInstance;
+ 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* pPrivilegeList = null;
- String encryptedPrivileges;
- String checksum;
-
- SysLog(NID_SEC, "Enter.");
ClearLastResult();
- r = RetrieveCipherPrivilege(appId, encryptedPrivileges, checksum);
- 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);
- 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.");
- pPrivilegeList = UnpackPrivilegeN(pTargetBitwisePrivilege);
- SysTryCatch(NID_SEC, pPrivilegeList != 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 (pTargetBitwisePrivilege)
- {
- free(pTargetBitwisePrivilege);
- pTargetBitwisePrivilege = null;
- }
-
- SysLog(NID_SEC, "Exit.");
- return pPrivilegeList;
+ return pReturnPrivilegeList.release();
}
result
-_PrivilegeManager::RetrieveCipherPrivilege(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum)
+_PrivilegeManager::RetrieveCipherPrivilegeN(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum, ArrayList*& pPrivilegeList)
{
result r = E_SUCCESS;
-
- SysLog(NID_SEC, "Enter.");
+ ArrayList tempPrivilegeList;
encryptedPrivileges.Clear();
checksum.Clear();
+ r = tempPrivilegeList.Construct();
+ SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
+
_PackageInfoImpl infoImpl;
r = infoImpl.Construct(appId);
if (r == E_APP_NOT_INSTALLED)
}
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
- r = infoImpl.GetPrivileges(encryptedPrivileges, checksum);
+ r = infoImpl.GetPrivileges(encryptedPrivileges, checksum, tempPrivilegeList);
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
SysTryReturnResult(NID_SEC, encryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
SysTryReturnResult(NID_SEC, checksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
- SysLog(NID_SEC, "Exit.");
+ pPrivilegeList = new ArrayList;
+ r = pPrivilegeList->Construct();
+
+ 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());
+ pPrivilegeList->Add(new String(*tempString));
+ }
+
+ tempPrivilegeList.RemoveAll(true);
return r;
}
result
-_PrivilegeManager::RetrieveCipherPrivilegeEx(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum)
+_PrivilegeManager::RetrieveCipherPrivilegeExN(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum, ArrayList*& pPrivilegeList)
{
result r = E_SUCCESS;
- SysLog(NID_SEC, "Enter.");
-
encryptedPrivileges.Clear();
checksum.Clear();
String tempEncryptedPrivileges;
String tempChecksum;
+ ArrayList tempPrivilegeList;
+
+ r = tempPrivilegeList.Construct();
+ SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
_PackageInfoImpl infoImpl;
r = infoImpl.Construct(appId);
}
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
- r = infoImpl.GetPrivileges(tempEncryptedPrivileges, tempChecksum);
+ r = infoImpl.GetPrivileges(tempEncryptedPrivileges, tempChecksum, tempPrivilegeList);
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
SysTryReturnResult(NID_SEC, tempEncryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
SysTryReturnResult(NID_SEC, tempChecksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
_PrivilegeInfo privilegeInfo;
- r = privilegeInfo.Construct(appId, tempEncryptedPrivileges, tempChecksum);
+ r = privilegeInfo.Construct(appId, tempEncryptedPrivileges, tempChecksum, &tempPrivilegeList);
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
r = privilegeInfo.GetEncryptedBitwise(encryptedPrivileges);
r = privilegeInfo.GetChecksum(checksum);
SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
- SysLog(NID_SEC, "Exit.");
+ pPrivilegeList = new ArrayList;
+ r = pPrivilegeList->Construct();
+
+ 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());
+ pPrivilegeList->Add(new String(*tempString));
+ }
+
+ tempPrivilegeList.RemoveAll(true);
return r;
}
String checksum;
std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(null);
_PackageInfoImpl infoImpl;
+ ArrayList* pPrivilegeList = null;
- SysLog(NID_SEC, "Enter.");
ClearLastResult();
pPrivilegeInfo.reset(__pPrivilegeCache->GetPrivilegeInfoN(appId));
}
else if (r == E_DATA_NOT_FOUND)
{
- r = RetrieveCipherPrivilege(appId, encryptedPrivileges, checksum);
+ 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.");
pPrivilegeInfo.reset(new (std::nothrow) _PrivilegeInfo());
SysTryReturn(NID_SEC, pPrivilegeInfo != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
- r = pPrivilegeInfo->Construct(appId, encryptedPrivileges, checksum);
+ r = pPrivilegeInfo->Construct(appId, encryptedPrivileges, checksum, pPrivilegeList);
SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
r = __pPrivilegeCache->AddPrivilegeInfo(*(pPrivilegeInfo.get()));
SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+ if (pPrivilegeList != null)
+ {
+ pPrivilegeList->RemoveAll(true);
+ delete pPrivilegeList;
+ }
}
else
{
return null;
}
- SysLog(NID_SEC, "Exit.");
return pPrivilegeInfo.release();
}
int privilegeEnum = 0;
std::unique_ptr<ArrayList> pPrivilegeList(null);
- SysLog(NID_SEC, "Enter.");
ClearLastResult();
SysTryReturn(NID_SEC, pBitwisePrivilege != null, null, E_INVALID_ARG, "One of the argument is invalid.");
{
if (privilegeEnum == privilegeListTable[index].privilege)
{
- String* privilegeString = new (std::nothrow) String(privilegeListTable[index].privilegeString);
+ String* privilegeString = new (std::nothrow) String(L"http://tizen.org/privilege/");
+ privilegeString->Append(privilegeListTable[index].privilegeString);
SysTryCatch(NID_SEC, privilegeString != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
"[E_OUT_OF_MEMORY]The memory is insufficient.");
}
}
- SysLog(NID_SEC, "Exit.");
return pPrivilegeList.release();
CATCH:
void
_PrivilegeManager::OnPackageInstallationCompleted(const PackageId& packageId, PackageInstallationResult installationResult)
{
- SysLog(NID_SEC, "Enter.");
-
__pPrivilegeCache->RemovePrivilegeInfo(packageId);
SysLog(NID_SEC, "%ls is removed.", packageId.GetPointer());
- SysLog(NID_SEC, "Exit.");
-
return;
}