Merge "Revert "Fix duplicated alarms."" into tizen_2.2
[platform/framework/native/appfw.git] / src / security / FSec_AccessController.cpp
index cd41a20..d7a7420 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 <FBaseSysLog.h>
 #include <FBaseString.h>
 #include <FBaseColArrayList.h>
+#include <FBase_StringConverter.h>
 #include <FIoFile.h>
 #include <FIo_IpcClient.h>
+#include <privacy_checker_client.h>
 #include "FSec_AccessController.h"
 #include "FSec_PrivilegeManager.h"
 #include "FSec_PrivilegeManagerMessage.h"
@@ -42,14 +43,22 @@ using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
 using namespace Tizen::Io;
 
-static _IpcClient ipcClient;
 static bool isConstructed = false;
+static std::unique_ptr<_IpcClient> pIpcClient(null);
+static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+static pthread_once_t ipcOnceBlock = PTHREAD_ONCE_INIT;
 
 namespace Tizen { namespace Security
 {
 
 _PrivilegeManager* _AccessController::__pPrivilegeManager = null;
 
+static std::unique_ptr<String> pEncryptedPrivileges(null);
+static std::unique_ptr<String> pChecksum(null);
+static std::unique_ptr<String> pEncryptedVisibility(null);
+static std::unique_ptr<String> pVisibilityChecksum(null);
+static std::unique_ptr<ArrayList> pPrivilegeList(null);
+
 _AccessController::_AccessController(void)
 {
 
@@ -57,38 +66,165 @@ _AccessController::_AccessController(void)
 
 _AccessController::~_AccessController(void)
 {
-
+       if (pPrivilegeList != null)
+       {
+               pPrivilegeList->RemoveAll(true);
+       }
 }
 
 result
-_AccessController::CheckSystemPrivilege(const AppId& appId, _Privilege privilege)
+_AccessController::CheckSystemPrivilege(const PackageId& packageId, _Privilege privilege)
 {
-       result r = E_SUCCESS;
-
        bool ret = false;
-       std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(null);
+
+       SysTryReturnResult(NID_SEC, (privilege >= 0) && (privilege < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
+
        String subAppId;
+       packageId.SubString(0, MAX_APP_ID_SIZE, subAppId);
+
        _PackageInfoImpl infoImpl;
-       String appType;
+       result r = infoImpl.Construct(subAppId);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
+
        String webAppType(L"wgt");
+       String appType = infoImpl.GetAppType();
+       if (appType.Equals(webAppType, true))
+       {
+               return E_SUCCESS;
+       }
 
-       SysLog(NID_SEC, "Enter.");
-       SysTryReturnResult(NID_SEC, privilege < _MAX_PRIVILEGE_ENUM, E_INVALID_ARG, "The privilege enumerator is invalid");
+       if (__pPrivilegeManager == null)
+       {
+               __pPrivilegeManager = _PrivilegeManager::GetInstance();
+       }
+       SysTryReturnResult(NID_SEC, __pPrivilegeManager != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(__pPrivilegeManager->RetrievePrivilegeInfoN(subAppId));
+       r = GetLastResult();
 
-       appId.SubString(0, MAX_APP_ID_SIZE, subAppId);
+       if (r == E_SUCCESS)
+       {
+               // nothing to do.
+       }
+       else if (r == E_DATA_NOT_FOUND)
+       {
+               SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+               goto CATCH;
+       }
+       else
+       {
+               SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+               return E_SYSTEM;
+       }
 
-       r = infoImpl.Construct(subAppId);
-       if (r == E_APP_NOT_INSTALLED)
+       ret = pPrivilegeInfo->HasPrivilege(privilege);
+       if (!ret)
        {
-               SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The package information does not exist.");
-               r = E_DATA_NOT_FOUND;
+               r = E_PRIVILEGE_DENIED;
                goto CATCH;
        }
 
-       appType = infoImpl.GetAppType();
+       r = CheckPrivacy(packageId, privilege);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
+       return r;
+
+CATCH:
+
+       SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
+
+       _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
+       pAppManagerImpl->TerminateApplications(packageId);
+
+       return r;
+}
+
+result
+_AccessController::CheckSystemPrivilege(const PackageId& packageId, _Privilege privilege1, _Privilege privilege2)
+{
+       bool ret = false;
+
+       SysTryReturnResult(NID_SEC, (privilege1 >= 0) && (privilege1 < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
+       SysTryReturnResult(NID_SEC, (privilege2 >= 0) && (privilege2 < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
+
+       String subAppId;
+       packageId.SubString(0, MAX_APP_ID_SIZE, subAppId);
+
+       _PackageInfoImpl infoImpl;
+       result r = infoImpl.Construct(subAppId);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
+
+       String webAppType(L"wgt");
+       String appType = infoImpl.GetAppType();
+       if (appType.Equals(webAppType, true))
+       {
+               return E_SUCCESS;
+       }
+
+       if (__pPrivilegeManager == null)
+       {
+               __pPrivilegeManager = _PrivilegeManager::GetInstance();
+       }
+       SysTryReturnResult(NID_SEC, __pPrivilegeManager != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(__pPrivilegeManager->RetrievePrivilegeInfoN(subAppId));
        r = GetLastResult();
+
+       if (r == E_SUCCESS)
+       {
+               // nothing to do.
+       }
+       else if (r == E_DATA_NOT_FOUND)
+       {
+               SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+               goto CATCH;
+       }
+       else
+       {
+               SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+               return E_SYSTEM;
+       }
+
+       ret = pPrivilegeInfo->HasPrivilegeEx(privilege1);
+       if (!ret)
+       {
+               ret = pPrivilegeInfo->HasPrivilege(privilege2);
+               if (!ret)
+               {
+                       r = E_PRIVILEGE_DENIED;
+                       goto CATCH;
+               }
+       }
+
+       r = CheckPrivacy(packageId, privilege2);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
+       return r;
+
+CATCH:
+
+       SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
+
+       _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
+       pAppManagerImpl->TerminateApplications(packageId);
+
+       return r;
+}
+
+result
+_AccessController::CheckPrivilege(const PackageId& packageId, const String& privilege)
+{
+       bool ret = false;
+
+       String subAppId;
+       packageId.SubString(0, MAX_APP_ID_SIZE, subAppId);
+
+       _PackageInfoImpl infoImpl;
+       result r = infoImpl.Construct(subAppId);
        SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
 
+       String webAppType(L"wgt");
+       String appType = infoImpl.GetAppType();
        if (appType.Equals(webAppType, true))
        {
                return E_SUCCESS;
@@ -100,7 +236,7 @@ _AccessController::CheckSystemPrivilege(const AppId& appId, _Privilege privilege
        }
        SysTryReturnResult(NID_SEC, __pPrivilegeManager != null, E_SYSTEM, "An unexpected system error occurred.");
 
-       pPrivilegeInfo.reset(__pPrivilegeManager->RetrievePrivilegeInfoN(subAppId));
+       std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(__pPrivilegeManager->RetrievePrivilegeInfoN(subAppId));
        r = GetLastResult();
 
        if (r == E_SUCCESS)
@@ -125,38 +261,50 @@ _AccessController::CheckSystemPrivilege(const AppId& appId, _Privilege privilege
                goto CATCH;
        }
 
-       SysLog(NID_SEC, "Exit.");
+       r = CheckPrivacy(packageId, privilege);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
        return r;
 
 CATCH:
 
        SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
-       SysLog(NID_SEC, "Exit.");
 
        _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
-       pAppManagerImpl->TerminateApplications(appId);
+       pAppManagerImpl->TerminateApplications(packageId);
 
        return r;
 }
 
-static std::unique_ptr<String> pEncryptedPrivileges(null);
-static std::unique_ptr<String> pChecksum(null);
-static std::unique_ptr<String> pEncryptedVisibility(null);
-static std::unique_ptr<String> pVisibilityChecksum(null);
+void
+_AccessController::InitIpcClient(void)
+{
+       std::unique_ptr<_IpcClient> pLocalIpcClient(new (std::nothrow) _IpcClient);
+       SysTryReturnVoidResult(NID_SEC, pLocalIpcClient != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+       result r = pLocalIpcClient->Construct(L"osp.security.ipcserver.privilegemanager", null);
+       SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "Failed to construct the instance of IPC.");
+
+       pIpcClient = std::move(pLocalIpcClient);
+       return;
+}
 
 void
 _AccessController::Initialize(void)
 {
        result r = E_SUCCESS;
-       result ipcResult = E_SUCCESS;
-
-       std::unique_ptr<IPC::Message> pCipherPrivilegeMessage(null);
-       std::unique_ptr<IPC::Message> pCipherVisibilityMessage(null);
 
-       SysLog(NID_SEC, "Enter");
-
-       r = ipcClient.Construct(L"osp.security.ipcserver.privilegemanager", null);
-       SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "Failed to construct the instance of IPC.");
+    if (pIpcClient == null)
+    {
+       pthread_once(&ipcOnceBlock, InitIpcClient);
+        r = GetLastResult();
+        if (IsFailed(r))
+        {
+                       ipcOnceBlock = PTHREAD_ONCE_INIT;
+                       SysLogException(NID_SEC, r, "[%s] Propagated.", GetErrorMessage(r));
+                       return;
+        }
+    }
 
        pEncryptedPrivileges.reset(new (std::nothrow) String());
        SysTryReturnVoidResult(NID_SEC, pEncryptedPrivileges != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
@@ -164,10 +312,14 @@ _AccessController::Initialize(void)
        pChecksum.reset(new (std::nothrow) String());
        SysTryReturnVoidResult(NID_SEC, pChecksum != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       pCipherPrivilegeMessage.reset(new (std::nothrow) PrivilegeManagerMsg_retrieve(pEncryptedPrivileges.get(), pChecksum.get(), &r));
+       pPrivilegeList.reset(new ArrayList());
+       SysTryReturnVoidResult(NID_SEC, pPrivilegeList != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+       pPrivilegeList->Construct();
+
+       std::unique_ptr<IPC::Message> pCipherPrivilegeMessage(new (std::nothrow) PrivilegeManagerMsg_retrieve(pEncryptedPrivileges.get(), pChecksum.get(), pPrivilegeList.get(), &r));
        SysTryReturnVoidResult(NID_SEC, pCipherPrivilegeMessage != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       ipcResult = ipcClient.SendRequest(pCipherPrivilegeMessage.get());
+       result ipcResult = pIpcClient->SendRequest(pCipherPrivilegeMessage.get());
        SysTryReturnVoidResult(NID_SEC, ipcResult == E_SUCCESS, E_SYSTEM, "Failed to send IPC message.");
        SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "Failed to retrieve privilege information");
 
@@ -177,16 +329,14 @@ _AccessController::Initialize(void)
        pVisibilityChecksum.reset(new (std::nothrow) String());
        SysTryReturnVoidResult(NID_SEC, pVisibilityChecksum != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       pCipherVisibilityMessage.reset(new (std::nothrow) PrivilegeManagerMsg_retrieveEx(pEncryptedVisibility.get(), pVisibilityChecksum.get(), &r));
+       std::unique_ptr<IPC::Message> pCipherVisibilityMessage(new (std::nothrow) PrivilegeManagerMsg_retrieveEx(pEncryptedVisibility.get(), pVisibilityChecksum.get(), &r));
        SysTryReturnVoidResult(NID_SEC, pCipherVisibilityMessage != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       ipcResult = ipcClient.SendRequest(pCipherVisibilityMessage.get());
+       ipcResult = pIpcClient->SendRequest(pCipherVisibilityMessage.get());
        SysTryReturnVoidResult(NID_SEC, ipcResult == E_SUCCESS, E_SYSTEM, "Failed to send IPC message.");
        SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "Failed to retrieve privilege information");
 
        isConstructed = true;
-
-    SysLog(NID_SEC, "Exit");
        return;
 }
 
@@ -194,21 +344,90 @@ result
 _AccessController::CheckUserPrivilege(_Privilege privilege)
 {
        result r = E_SUCCESS;
-       static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
-
        bool ret = false;
-
-       _AppType appType = _APP_TYPE_UI_APP;
        _PrivilegeInfo privilegeInfo;
+       ClearLastResult();
+
+       SysTryReturnResult(NID_SEC, (privilege >= 0) && (privilege < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
+
+       int appType = _AppInfo::GetAppType();
+       PackageId packageId = _AppInfo::GetPackageId();
+       packageId[0] = packageId[0];
+
+       if ((appType & _APP_TYPE_WEB_APP) != _APP_TYPE_WEB_APP)
+       {
+           if (isConstructed != true)
+           {
+               pthread_once(&onceBlock, Initialize);
+               r = GetLastResult();
+               if (IsFailed(r))
+               {
+                       if (r == E_DATA_NOT_FOUND)
+                       {
+                               SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+                               goto CATCH;
+                       }
+                       else
+                       {
+                               onceBlock = PTHREAD_ONCE_INIT;
+                                       SysLogException(NID_SEC, r, "[%s] Propagated.", GetErrorMessage(r));
+                       }
+                               return r;
+               }
+           }
+
+               if ((pEncryptedPrivileges != null) && (pChecksum != null) && (pEncryptedVisibility != null) && (pVisibilityChecksum != null))
+               {
+                       r = privilegeInfo.Construct(packageId, *(pEncryptedPrivileges.get()), *(pChecksum.get()), *(pEncryptedVisibility.get()), *(pVisibilityChecksum.get()), pPrivilegeList.get());
+                       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred. %ls", packageId.GetPointer());
+
+                       SysLog(NID_SEC, "%ls is in the cache [client]", privilegeInfo.GetAppId().GetPointer());
+               }
+               else
+               {
+                       SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+                       r =  E_DATA_NOT_FOUND;
+                       goto CATCH;
+               }
+
+               ret = privilegeInfo.HasPrivilege(privilege);
+               if (!ret)
+               {
+                       r = E_PRIVILEGE_DENIED;
+                       goto CATCH;
+               }
+       }
+
+       r = CheckPrivacy(packageId, privilege);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
+       return r;
+
+CATCH:
+
+       SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
+
+       _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
+       pAppManagerImpl->TerminateApplications(packageId);
 
-       SysLog(NID_SEC, "Enter.");
+       return r;
+
+}
+
+result
+_AccessController::CheckUserPrivilege(_Privilege privilege1, _Privilege privilege2)
+{
+       result r = E_SUCCESS;
+       bool ret = false;
+       _PrivilegeInfo privilegeInfo;
        ClearLastResult();
 
-       SysTryReturnResult(NID_SEC, privilege < _MAX_PRIVILEGE_ENUM, E_INVALID_ARG, "The privilege enumerator is invalid");
-       //SysAssertf(privilegeLevelListTable[privilege][_PRV_API_VER_2_0] == _PRV_LEVEL_USER, "System-level privilege is passed to CheckUserPrivilege.");
+       SysTryReturnResult(NID_SEC, (privilege1 >= 0) && (privilege1 < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
+       SysTryReturnResult(NID_SEC, (privilege2 >= 0) && (privilege2 < _MAX_PRIVILEGE_ENUM), E_INVALID_ARG, "The privilege enumerator is invalid");
 
-       appType = _AppInfo::GetAppType();
-       const PackageId& packageId = _AppInfo::GetPackageId();
+       int appType = _AppInfo::GetAppType();
+       PackageId packageId = _AppInfo::GetPackageId();
+       packageId[0] = packageId[0];
 
        if ((appType & _APP_TYPE_WEB_APP) != _APP_TYPE_WEB_APP)
        {
@@ -234,7 +453,87 @@ _AccessController::CheckUserPrivilege(_Privilege privilege)
 
                if ((pEncryptedPrivileges != null) && (pChecksum != null) && (pEncryptedVisibility != null) && (pVisibilityChecksum != null))
                {
-                       r = privilegeInfo.Construct(packageId, *(pEncryptedPrivileges.get()), *(pChecksum.get()), *(pEncryptedVisibility.get()), *(pVisibilityChecksum.get()));
+                       r = privilegeInfo.Construct(packageId, *(pEncryptedPrivileges.get()), *(pChecksum.get()), *(pEncryptedVisibility.get()), *(pVisibilityChecksum.get()), pPrivilegeList.get());
+                       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred. %ls", packageId.GetPointer());
+
+                       SysLog(NID_SEC, "%ls is in the cache [client]", privilegeInfo.GetAppId().GetPointer());
+               }
+               else
+               {
+                       SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+                       r =  E_DATA_NOT_FOUND;
+                       goto CATCH;
+               }
+
+               ret = privilegeInfo.HasPrivilegeEx(privilege1);
+               if (!ret)
+               {
+                       ret = privilegeInfo.HasPrivilege(privilege2);
+                       if (!ret)
+                       {
+                               r = E_PRIVILEGE_DENIED;
+                               goto CATCH;
+                       }
+               }
+       }
+
+       r = CheckPrivacy(packageId, privilege2);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
+       return r;
+
+CATCH:
+
+       SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
+
+       _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
+       pAppManagerImpl->TerminateApplications(packageId);
+
+       return r;
+
+}
+
+
+result
+_AccessController::CheckPrivilege(const String& privilege)
+{
+       result r = E_SUCCESS;
+       bool ret = false;
+       _PrivilegeInfo privilegeInfo;
+       ClearLastResult();
+
+       int appType = _AppInfo::GetAppType();
+       PackageId packageId = _AppInfo::GetPackageId();
+       packageId[0] = packageId[0];
+
+       if ((appType & _APP_TYPE_WEB_APP) != _APP_TYPE_WEB_APP)
+       {
+               if (isConstructed != true)
+               {
+                       pthread_once(&onceBlock, Initialize);
+                       r = GetLastResult();
+                       if (IsFailed(r))
+                       {
+                               if (r == E_DATA_NOT_FOUND)
+                               {
+                                       SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+                                       goto CATCH;
+                               }
+                               else
+                               {
+                                       onceBlock = PTHREAD_ONCE_INIT;
+                                       SysLogException(NID_SEC, r, "[%s] Propagated.", GetErrorMessage(r));
+                               }
+                               return r;
+                       }
+               }
+
+               std::unique_ptr<IEnumerator> pEnum(null);
+               pEnum.reset(pPrivilegeList->GetEnumeratorN());
+
+               if ((pEncryptedPrivileges != null) && (pChecksum != null) && (pEncryptedVisibility != null) && (pVisibilityChecksum != null))
+               {
+                       r = privilegeInfo.Construct(packageId, *(pEncryptedPrivileges.get()), *(pChecksum.get()), *(pEncryptedVisibility.get()), *(pVisibilityChecksum.get()), pPrivilegeList.get());
                        SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred. %ls", packageId.GetPointer());
 
                        SysLog(NID_SEC, "%ls is in the cache [client]", privilegeInfo.GetAppId().GetPointer());
@@ -252,21 +551,76 @@ _AccessController::CheckUserPrivilege(_Privilege privilege)
                        r = E_PRIVILEGE_DENIED;
                        goto CATCH;
                }
+
        }
 
-       SysLog(NID_SEC, "Exit.");
+       r = CheckPrivacy(packageId, privilege);
+       SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_USER_NOT_CONSENTED, "The user blocks an application from calling the method.");
+
        return r;
 
 CATCH:
 
        SysLogException(NID_SEC,  r, "[E_PRIVILEGE_DENIED] The application does not have the privilege to call this method.");
-       SysLog(NID_SEC, "Exit.");
 
        _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
        pAppManagerImpl->TerminateApplications(packageId);
 
        return r;
+}
+
+result
+_AccessController::CheckPrivacy(const PackageId & packageId, _Privilege privilege)
+{
+       result r = E_SUCCESS;
+
+       if (privacyListTable[privilege] != true)
+       {
+               return r;
+       }
+
+       std::unique_ptr<char[]> pPackageId(null);
+       pPackageId.reset(_StringConverter::CopyToCharArrayN(packageId));
+       SysTryReturnResult(NID_SEC, pPackageId != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       std::unique_ptr<char[]> pPrivilegeId(null);
+       String privilegeId(L"http://tizen.org/privilege/");
+       privilegeId.Append(privilegeListTable[privilege].privilegeString);
 
+       pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(privilegeId));
+       SysTryReturnResult(NID_SEC, pPrivilegeId != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       int ret = privacy_checker_check_package_by_privilege(pPackageId.get(), pPrivilegeId.get());
+       if (ret != PRIV_MGR_ERROR_SUCCESS)
+       {
+               r = E_USER_NOT_CONSENTED;
+               SysLog(NID_SEC, "Result : FALSE [Privacy]");
+       }
+
+       return r;
+}
+
+result
+_AccessController::CheckPrivacy(const PackageId & packageId, const String& privilege)
+{
+       result r = E_SUCCESS;
+
+       std::unique_ptr<char[]> pPackageId(null);
+       pPackageId.reset(_StringConverter::CopyToCharArrayN(packageId));
+       SysTryReturnResult(NID_SEC, pPackageId != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       std::unique_ptr<char[]> pPrivilegeId(null);
+       pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(privilege));
+       SysTryReturnResult(NID_SEC, pPrivilegeId != null, E_SYSTEM, "An unexpected system error occurred.");
+
+       int ret = privacy_checker_check_package_by_privilege(pPackageId.get(), pPrivilegeId.get());
+       if (ret != PRIV_MGR_ERROR_SUCCESS)
+       {
+               r = E_USER_NOT_CONSENTED;
+               SysLog(NID_SEC, "Result : FALSE [Privacy]");
+       }
+
+       return r;
 }
 
 }} //Tizen::Security