2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FSec_PrivilegeManager.cpp
19 * @brief This is the implementation for the _PrivilegeManager class.
24 #include <unique_ptr.h>
25 #include <FAppPkg_PackageInfoImpl.h>
26 #include <FAppPkg_PackageManagerImpl.h>
27 #include <FBaseString.h>
28 #include <FBaseSysLog.h>
29 #include <FIo_IpcClient.h>
30 #include "FSec_AccessControlTypes.h"
31 #include "FSec_PrivilegeManager.h"
32 #include "FSec_PrivilegeManagerMessage.h"
33 #include "FSec_PrivilegeCache.h"
34 #include "FSec_PrivilegeInfo.h"
36 using namespace Tizen::App;
37 using namespace Tizen::App::Package;
38 using namespace Tizen::Base;
39 using namespace Tizen::Base::Collection;
40 using namespace Tizen::Io;
42 namespace Tizen { namespace Security
45 _PrivilegeManager* _PrivilegeManager::__pPrivilegeManagerInstance = null;
47 _PrivilegeManager::_PrivilegeManager(void)
48 : __pPrivilegeCache(null)
53 _PrivilegeManager::~_PrivilegeManager(void)
55 delete __pPrivilegeCache;
60 _PrivilegeManager::Construct(void)
64 _PackageManagerImpl* pPackageManagerImpl = null;
66 pPackageManagerImpl = _PackageManagerImpl::GetInstance();
67 SysTryReturnResult(NID_SEC, pPackageManagerImpl != null, E_SYSTEM, "An unexpected system error occurred.");
69 //pPackageManagerImpl->RemoveEventListener(this);
70 r = pPackageManagerImpl->AddEventListener(this);
71 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
73 __pPrivilegeCache = new (std::nothrow) _PrivilegeCache();
74 SysTryReturnResult(NID_SEC, __pPrivilegeCache != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
76 r = __pPrivilegeCache->Construct();
77 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
83 delete __pPrivilegeCache;
88 _PrivilegeManager::InitInstance(void)
91 static _PrivilegeManager instance;
95 r = instance.Construct();
96 SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
98 __pPrivilegeManagerInstance = &instance;
104 _PrivilegeManager::GetInstance(void)
106 result r = E_SUCCESS;
107 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
111 if (__pPrivilegeManagerInstance == null)
113 pthread_once(&onceBlock, InitInstance);
118 onceBlock = PTHREAD_ONCE_INIT;
122 return __pPrivilegeManagerInstance;
127 _PrivilegeManager::GetPrivilegeListN(const AppId& appId)
129 result r = E_SUCCESS;
130 _PrivilegeInfo privilegeInfo;
131 byte* pTargetBitwisePrivilege = null;
132 IList* pReturnPrivilegeList = null;
133 String encryptedPrivileges;
135 ArrayList* pPrivilegeList = null;
136 IEnumerator* pEnum = null;
140 r = RetrieveCipherPrivilegeN(appId, encryptedPrivileges, checksum, pPrivilegeList);
141 if (r == E_DATA_NOT_FOUND)
143 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
146 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
148 r = privilegeInfo.Construct(appId, encryptedPrivileges, checksum, pPrivilegeList);
149 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
151 r = privilegeInfo.GetBitwisePrivilegeN(pTargetBitwisePrivilege);
152 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
154 pReturnPrivilegeList = UnpackPrivilegeN(pTargetBitwisePrivilege);
155 SysTryCatch(NID_SEC, pReturnPrivilegeList != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
157 pEnum = pPrivilegeList->GetEnumeratorN();
158 SysTryCatch(NID_SEC, pEnum != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
160 while (pEnum->MoveNext() == E_SUCCESS)
162 String* tempString = static_cast< String* >(pEnum->GetCurrent());
163 pReturnPrivilegeList->Add(new String(*tempString));
170 if (pPrivilegeList != null)
172 pPrivilegeList->RemoveAll(true);
173 delete pPrivilegeList;
176 if (pTargetBitwisePrivilege)
178 free(pTargetBitwisePrivilege);
179 pTargetBitwisePrivilege = null;
187 return pReturnPrivilegeList;
191 _PrivilegeManager::RetrieveCipherPrivilegeN(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum, ArrayList*& pPrivilegeList)
193 result r = E_SUCCESS;
194 ArrayList tempPrivilegeList;
196 encryptedPrivileges.Clear();
199 r = tempPrivilegeList.Construct();
200 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
202 _PackageInfoImpl infoImpl;
203 r = infoImpl.Construct(appId);
204 if (r == E_APP_NOT_INSTALLED)
206 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
207 return E_DATA_NOT_FOUND;
209 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
211 r = infoImpl.GetPrivileges(encryptedPrivileges, checksum, tempPrivilegeList);
212 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
213 SysTryReturnResult(NID_SEC, encryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
214 SysTryReturnResult(NID_SEC, checksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
216 pPrivilegeList = new ArrayList;
217 r = pPrivilegeList->Construct();
219 IEnumerator* pEnum = tempPrivilegeList.GetEnumeratorN();
220 while (pEnum->MoveNext() == E_SUCCESS)
222 String* tempString = static_cast< String* >(pEnum->GetCurrent());
223 pPrivilegeList->Add(new String(*tempString));
226 tempPrivilegeList.RemoveAll(true);
231 _PrivilegeManager::RetrieveCipherPrivilegeExN(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum, ArrayList*& pPrivilegeList)
233 result r = E_SUCCESS;
235 encryptedPrivileges.Clear();
238 String tempEncryptedPrivileges;
240 ArrayList tempPrivilegeList;
242 r = tempPrivilegeList.Construct();
243 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
245 _PackageInfoImpl infoImpl;
246 r = infoImpl.Construct(appId);
247 if (r == E_APP_NOT_INSTALLED)
249 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
250 return E_DATA_NOT_FOUND;
252 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
254 r = infoImpl.GetPrivileges(tempEncryptedPrivileges, tempChecksum, tempPrivilegeList);
255 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
256 SysTryReturnResult(NID_SEC, tempEncryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
257 SysTryReturnResult(NID_SEC, tempChecksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
259 _PrivilegeInfo privilegeInfo;
261 r = privilegeInfo.Construct(appId, tempEncryptedPrivileges, tempChecksum, &tempPrivilegeList);
262 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
264 r = privilegeInfo.GetEncryptedBitwise(encryptedPrivileges);
265 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
267 r = privilegeInfo.GetChecksum(checksum);
268 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
270 pPrivilegeList = new ArrayList;
271 r = pPrivilegeList->Construct();
273 IEnumerator* pEnum = tempPrivilegeList.GetEnumeratorN();
274 while (pEnum->MoveNext() == E_SUCCESS)
276 String* tempString = static_cast< String* >(pEnum->GetCurrent());
277 pPrivilegeList->Add(new String(*tempString));
280 tempPrivilegeList.RemoveAll(true);
285 _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
287 result r = E_SUCCESS;
289 String encryptedPrivileges;
291 std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(null);
292 _PackageInfoImpl infoImpl;
293 ArrayList* pPrivilegeList = null;
297 pPrivilegeInfo.reset(__pPrivilegeCache->GetPrivilegeInfoN(appId));
304 else if (r == E_DATA_NOT_FOUND)
306 r = RetrieveCipherPrivilegeN(appId, encryptedPrivileges, checksum, pPrivilegeList);
307 if (r == E_DATA_NOT_FOUND)
309 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
312 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
314 pPrivilegeInfo.reset(new (std::nothrow) _PrivilegeInfo());
315 SysTryReturn(NID_SEC, pPrivilegeInfo != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
317 r = pPrivilegeInfo->Construct(appId, encryptedPrivileges, checksum, pPrivilegeList);
318 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
320 r = __pPrivilegeCache->AddPrivilegeInfo(*(pPrivilegeInfo.get()));
321 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
323 if (pPrivilegeList != null)
325 pPrivilegeList->RemoveAll(true);
326 delete pPrivilegeList;
332 SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
336 return pPrivilegeInfo.release();
341 _PrivilegeManager::UnpackPrivilegeN(const byte* pBitwisePrivilege)
343 result r = E_SUCCESS;
346 int bytePosition = 0;
348 int privilegeBit = 0;
349 int privilegeEnum = 0;
350 std::unique_ptr<ArrayList> pPrivilegeList(null);
354 SysTryReturn(NID_SEC, pBitwisePrivilege != null, null, E_INVALID_ARG, "One of the argument is invalid.");
356 pPrivilegeList.reset(new (std::nothrow) ArrayList());
357 SysTryReturn(NID_SEC, pPrivilegeList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
359 r = pPrivilegeList->Construct();
360 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
362 for (bytePosition = 0; bytePosition < MAX_BITWISE_PRIV_SIZE; bytePosition++)
366 if (!(pBitwisePrivilege[bytePosition] & 0xFF))
368 // Pass the checking of empty byte filed.
372 for (bitPosition = 0; bitPosition < _BITS_IN_BYTE; bitPosition++)
374 privilegeBit = (int) (pBitwisePrivilege[bytePosition] & maskFlag);
377 // Shift the maskFlag by 1 bit when face the empty bit.
378 maskFlag = maskFlag << 1;
382 privilegeEnum = (bytePosition * _BITS_IN_BYTE) + bitPosition;
384 for (index = 0; index < _MAX_PRIVILEGE_ENUM; index++)
386 if (privilegeEnum == privilegeListTable[index].privilege)
388 String* privilegeString = new (std::nothrow) String(L"http://tizen.org/privilege/");
389 privilegeString->Append(privilegeListTable[index].privilegeString);
390 SysTryCatch(NID_SEC, privilegeString != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
391 "[E_OUT_OF_MEMORY]The memory is insufficient.");
393 pPrivilegeList->Add(*privilegeString);
398 // Shift the maskFlag by 1 bit to check the next byte filed.
399 maskFlag = maskFlag << 1;
403 return pPrivilegeList.release();
407 pPrivilegeList->RemoveAll(true);
412 _PrivilegeManager::OnPackageInstallationCompleted(const PackageId& packageId, PackageInstallationResult installationResult)
414 __pPrivilegeCache->RemovePrivilegeInfo(packageId);
415 SysLog(NID_SEC, "%ls is removed.", packageId.GetPointer());