Merge "Fixed Klocworks issues" into tizen_2.2
[platform/framework/native/appfw.git] / src / security / FSec_PrivilegeManager.cpp
index c92d947..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"
@@ -34,7 +35,6 @@
 #include "FSec_PrivilegeCache.h"
 #include "FSec_PrivilegeInfo.h"
 
-
 using namespace Tizen::App;
 using namespace Tizen::App::Package;
 using namespace Tizen::Base;
@@ -63,8 +63,6 @@ _PrivilegeManager::Construct(void)
 {
        result r = E_SUCCESS;
 
-       SysLog(NID_SEC, "Enter.");
-
        _PackageManagerImpl* pPackageManagerImpl = null;
 
        pPackageManagerImpl = _PackageManagerImpl::GetInstance();
@@ -80,14 +78,11 @@ _PrivilegeManager::Construct(void)
        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;
 }
 
@@ -97,7 +92,6 @@ _PrivilegeManager::InitInstance(void)
        result r = E_SUCCESS;
        static _PrivilegeManager instance;
 
-       SysLog(NID_SEC, "Enter");
        ClearLastResult();
 
        r = instance.Construct();
@@ -105,7 +99,7 @@ _PrivilegeManager::InitInstance(void)
 
        __pPrivilegeManagerInstance = &instance;
 
-    SysLog(NID_SEC, "Exit");
+       return;
 }
 
 _PrivilegeManager*
@@ -114,7 +108,6 @@ _PrivilegeManager::GetInstance(void)
        result r = E_SUCCESS;
        static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
 
-       SysLog(NID_SEC, "Enter");
        ClearLastResult();
 
     if (__pPrivilegeManagerInstance == null)
@@ -128,66 +121,59 @@ _PrivilegeManager::GetInstance(void)
         }
     }
 
-    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)
@@ -197,27 +183,42 @@ _PrivilegeManager::RetrieveCipherPrivilege(const AppId& appId, Tizen::Base::Stri
        }
        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);
@@ -228,14 +229,14 @@ _PrivilegeManager::RetrieveCipherPrivilegeEx(const AppId& appId, Tizen::Base::St
        }
        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);
@@ -244,7 +245,20 @@ _PrivilegeManager::RetrieveCipherPrivilegeEx(const AppId& appId, Tizen::Base::St
        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;
 }
 
@@ -257,8 +271,8 @@ _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
        String checksum;
        std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(null);
        _PackageInfoImpl infoImpl;
+       ArrayList* pPrivilegeList = null;
 
-       SysLog(NID_SEC, "Enter.");
        ClearLastResult();
 
        pPrivilegeInfo.reset(__pPrivilegeCache->GetPrivilegeInfoN(appId));
@@ -270,7 +284,7 @@ _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
        }
        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.");
@@ -281,11 +295,17 @@ _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
                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
        {
@@ -294,7 +314,6 @@ _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
                return null;
        }
 
-       SysLog(NID_SEC, "Exit.");
        return pPrivilegeInfo.release();
 }
 
@@ -311,7 +330,6 @@ _PrivilegeManager::UnpackPrivilegeN(const byte* pBitwisePrivilege)
        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.");
@@ -348,7 +366,8 @@ _PrivilegeManager::UnpackPrivilegeN(const byte* pBitwisePrivilege)
                        {
                                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.");
 
@@ -362,7 +381,6 @@ _PrivilegeManager::UnpackPrivilegeN(const byte* pBitwisePrivilege)
                }
        }
 
-       SysLog(NID_SEC, "Exit.");
        return pPrivilegeList.release();
 
 CATCH:
@@ -374,13 +392,9 @@ 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;
 }