2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FSec_PrivilegeManager.cpp
20 * @brief This is the implementation for the _PrivilegeManager class.
25 #include <unique_ptr.h>
26 #include <FAppPkg_PackageInfoImpl.h>
27 #include <FAppPkg_PackageManagerImpl.h>
28 #include <FBaseString.h>
29 #include <FBaseSysLog.h>
30 #include <FIo_IpcClient.h>
31 #include "FSec_AccessControlTypes.h"
32 #include "FSec_PrivilegeManager.h"
33 #include "FSec_PrivilegeManagerMessage.h"
34 #include "FSec_PrivilegeCache.h"
35 #include "FSec_PrivilegeInfo.h"
38 using namespace Tizen::App;
39 using namespace Tizen::App::Package;
40 using namespace Tizen::Base;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::Io;
44 namespace Tizen { namespace Security
47 _PrivilegeManager* _PrivilegeManager::__pPrivilegeManagerInstance = null;
49 _PrivilegeManager::_PrivilegeManager(void)
50 : __pPrivilegeCache(null)
55 _PrivilegeManager::~_PrivilegeManager(void)
57 delete __pPrivilegeCache;
62 _PrivilegeManager::Construct(void)
66 SysLog(NID_SEC, "Enter.");
68 _PackageManagerImpl* pPackageManagerImpl = null;
70 pPackageManagerImpl = _PackageManagerImpl::GetInstance();
71 SysTryReturnResult(NID_SEC, pPackageManagerImpl != null, E_SYSTEM, "An unexpected system error occurred.");
73 //pPackageManagerImpl->RemoveEventListener(this);
74 r = pPackageManagerImpl->AddEventListener(this);
75 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
77 __pPrivilegeCache = new (std::nothrow) _PrivilegeCache();
78 SysTryReturnResult(NID_SEC, __pPrivilegeCache != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
80 r = __pPrivilegeCache->Construct();
81 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
83 SysLog(NID_SEC, "Exit.");
88 delete __pPrivilegeCache;
90 SysLog(NID_SEC, "Exit.");
95 _PrivilegeManager::InitInstance(void)
98 static _PrivilegeManager instance;
100 SysLog(NID_SEC, "Enter");
103 r = instance.Construct();
104 SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
106 __pPrivilegeManagerInstance = &instance;
108 SysLog(NID_SEC, "Exit");
112 _PrivilegeManager::GetInstance(void)
114 result r = E_SUCCESS;
115 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
117 SysLog(NID_SEC, "Enter");
120 if (__pPrivilegeManagerInstance == null)
122 pthread_once(&onceBlock, InitInstance);
127 onceBlock = PTHREAD_ONCE_INIT;
131 SysLog(NID_SEC, "Exit");
133 return __pPrivilegeManagerInstance;
138 _PrivilegeManager::GetPrivilegeListN(const AppId& appId)
140 result r = E_SUCCESS;
141 _PrivilegeInfo privilegeInfo;
142 byte* pTargetBitwisePrivilege = null;
143 IList* pPrivilegeList = null;
144 String encryptedPrivileges;
147 SysLog(NID_SEC, "Enter.");
150 r = RetrieveCipherPrivilege(appId, encryptedPrivileges, checksum);
151 if (r == E_DATA_NOT_FOUND)
153 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
156 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
158 r = privilegeInfo.Construct(appId, encryptedPrivileges, checksum);
159 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
161 r = privilegeInfo.GetBitwisePrivilegeN(pTargetBitwisePrivilege);
162 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
164 pPrivilegeList = UnpackPrivilegeN(pTargetBitwisePrivilege);
165 SysTryCatch(NID_SEC, pPrivilegeList != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
171 if (pTargetBitwisePrivilege)
173 free(pTargetBitwisePrivilege);
174 pTargetBitwisePrivilege = null;
177 SysLog(NID_SEC, "Exit.");
178 return pPrivilegeList;
182 _PrivilegeManager::RetrieveCipherPrivilege(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum)
184 result r = E_SUCCESS;
186 SysLog(NID_SEC, "Enter.");
188 encryptedPrivileges.Clear();
191 _PackageInfoImpl infoImpl;
192 r = infoImpl.Construct(appId);
193 if (r == E_APP_NOT_INSTALLED)
195 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
196 return E_DATA_NOT_FOUND;
198 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
200 r = infoImpl.GetPrivileges(encryptedPrivileges, checksum);
201 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
202 SysTryReturnResult(NID_SEC, encryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
203 SysTryReturnResult(NID_SEC, checksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
205 SysLog(NID_SEC, "Exit.");
210 _PrivilegeManager::RetrieveCipherPrivilegeEx(const AppId& appId, Tizen::Base::String& encryptedPrivileges, Tizen::Base::String& checksum)
212 result r = E_SUCCESS;
214 SysLog(NID_SEC, "Enter.");
216 encryptedPrivileges.Clear();
219 String tempEncryptedPrivileges;
222 _PackageInfoImpl infoImpl;
223 r = infoImpl.Construct(appId);
224 if (r == E_APP_NOT_INSTALLED)
226 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
227 return E_DATA_NOT_FOUND;
229 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
231 r = infoImpl.GetPrivileges(tempEncryptedPrivileges, tempChecksum);
232 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
233 SysTryReturnResult(NID_SEC, tempEncryptedPrivileges.IsEmpty() != true, E_DATA_NOT_FOUND, "The privilege information does not exist.");
234 SysTryReturnResult(NID_SEC, tempChecksum.IsEmpty() != true, E_SYSTEM, "An unexpected system error occurred.");
236 _PrivilegeInfo privilegeInfo;
238 r = privilegeInfo.Construct(appId, tempEncryptedPrivileges, tempChecksum);
239 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
241 r = privilegeInfo.GetEncryptedBitwise(encryptedPrivileges);
242 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
244 r = privilegeInfo.GetChecksum(checksum);
245 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
247 SysLog(NID_SEC, "Exit.");
252 _PrivilegeManager::RetrievePrivilegeInfoN(const AppId& appId) const
254 result r = E_SUCCESS;
256 String encryptedPrivileges;
258 std::unique_ptr<_PrivilegeInfo> pPrivilegeInfo(null);
259 _PackageInfoImpl infoImpl;
261 SysLog(NID_SEC, "Enter.");
264 pPrivilegeInfo.reset(__pPrivilegeCache->GetPrivilegeInfoN(appId));
271 else if (r == E_DATA_NOT_FOUND)
273 r = RetrieveCipherPrivilege(appId, encryptedPrivileges, checksum);
274 if (r == E_DATA_NOT_FOUND)
276 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
279 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
281 pPrivilegeInfo.reset(new (std::nothrow) _PrivilegeInfo());
282 SysTryReturn(NID_SEC, pPrivilegeInfo != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
284 r = pPrivilegeInfo->Construct(appId, encryptedPrivileges, checksum);
285 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
287 r = __pPrivilegeCache->AddPrivilegeInfo(*(pPrivilegeInfo.get()));
288 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
293 SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
297 SysLog(NID_SEC, "Exit.");
298 return pPrivilegeInfo.release();
303 _PrivilegeManager::UnpackPrivilegeN(const byte* pBitwisePrivilege)
305 result r = E_SUCCESS;
308 int bytePosition = 0;
310 int privilegeBit = 0;
311 int privilegeEnum = 0;
312 std::unique_ptr<ArrayList> pPrivilegeList(null);
314 SysLog(NID_SEC, "Enter.");
317 SysTryReturn(NID_SEC, pBitwisePrivilege != null, null, E_INVALID_ARG, "One of the argument is invalid.");
319 pPrivilegeList.reset(new (std::nothrow) ArrayList());
320 SysTryReturn(NID_SEC, pPrivilegeList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
322 r = pPrivilegeList->Construct();
323 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
325 for (bytePosition = 0; bytePosition < MAX_BITWISE_PRIV_SIZE; bytePosition++)
329 if (!(pBitwisePrivilege[bytePosition] & 0xFF))
331 // Pass the checking of empty byte filed.
335 for (bitPosition = 0; bitPosition < _BITS_IN_BYTE; bitPosition++)
337 privilegeBit = (int) (pBitwisePrivilege[bytePosition] & maskFlag);
340 // Shift the maskFlag by 1 bit when face the empty bit.
341 maskFlag = maskFlag << 1;
345 privilegeEnum = (bytePosition * _BITS_IN_BYTE) + bitPosition;
347 for (index = 0; index < _MAX_PRIVILEGE_ENUM; index++)
349 if (privilegeEnum == privilegeListTable[index].privilege)
351 String* privilegeString = new (std::nothrow) String(privilegeListTable[index].privilegeString);
352 SysTryCatch(NID_SEC, privilegeString != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
353 "[E_OUT_OF_MEMORY]The memory is insufficient.");
355 pPrivilegeList->Add(*privilegeString);
360 // Shift the maskFlag by 1 bit to check the next byte filed.
361 maskFlag = maskFlag << 1;
365 SysLog(NID_SEC, "Exit.");
366 return pPrivilegeList.release();
370 pPrivilegeList->RemoveAll(true);
375 _PrivilegeManager::OnPackageInstallationCompleted(const PackageId& packageId, PackageInstallationResult installationResult)
377 SysLog(NID_SEC, "Enter.");
379 __pPrivilegeCache->RemovePrivilegeInfo(packageId);
380 SysLog(NID_SEC, "%ls is removed.", packageId.GetPointer());
382 SysLog(NID_SEC, "Exit.");