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_PrivilegeInfoImpl.cpp
20 * @brief This is the implementation for the _PrivilegeInfoImpl class.
27 #include <unique_ptr.h>
29 #include <FSysSystemTime.h>
30 #include <FSecPrivilegeInfo.h>
31 #include <FBaseSysLog.h>
33 #include <FBase_StringConverter.h>
34 #include <FSec_AccessControlTypes.h>
35 #include <FBaseUtilStringTokenizer.h>
37 #include "FSec_PrivilegeInfoImpl.h"
39 using namespace Tizen::Base::Runtime;
40 using namespace Tizen::Base;
41 using namespace Tizen::Base::Utility;
42 using namespace Tizen::Base::Collection;
43 using namespace Tizen::Io;
45 namespace Tizen { namespace Security
48 _PrivilegeInfoImpl* _PrivilegeInfoImpl::__pPrivilegeInfoImplInstance = null;
50 _PrivilegeInfoImpl::_PrivilegeInfoImpl(void)
55 _PrivilegeInfoImpl::~_PrivilegeInfoImpl(void)
62 _PrivilegeInfoImpl::Construct(void)
68 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
70 Database* pDb = new Database;
71 SysTryReturnResult(NID_SEC, pDb != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
73 r = pDb->Construct(PRIVILEGE_DESCRIPTION_DATABASE_FILE_NAME, false);
74 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
82 _PrivilegeInfoImpl::CheckDatabase(void)
84 if (File::IsFileExist(PRIVILEGE_DESCRIPTION_DATABASE_FILE_NAME) != true)
86 SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] Privilege information DB is not exist.");
95 _PrivilegeInfoImpl::InitInstance(void)
98 static _PrivilegeInfoImpl instance;
102 r = instance.Construct();
103 SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
105 __pPrivilegeInfoImplInstance = &instance;
109 _PrivilegeInfoImpl::GetInstance(void)
111 result r = E_SUCCESS;
112 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
116 if (__pPrivilegeInfoImplInstance == null)
118 pthread_once(&onceBlock, InitInstance);
123 onceBlock = PTHREAD_ONCE_INIT;
124 __pPrivilegeInfoImplInstance = null;
125 SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
129 return __pPrivilegeInfoImplInstance;
133 _PrivilegeInfoImpl::GetName(const String& privilege) const
136 result r = E_SUCCESS;
137 DbStatement* pStmt = null;
138 DbEnumerator* pEnum = null;
141 String privilegeURI = L"http://tizen.org/privilege/";
143 String privilegeString;
145 SysTryCatch(NID_SEC, (privilege.GetLength()) > (privilegeURI.GetLength()), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
148 privilege.SubString(0, privilegeURI.GetLength(), uriString);
149 SysTryCatch(NID_SEC, uriString.Equals(privilegeURI, true), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
151 privilege.SubString(privilegeURI.GetLength(), privilege.GetLength()-privilegeURI.GetLength(), privilegeString);
152 query.Format(1024, L"SELECT NAME FROM Privileges WHERE PRIVILEGE = '%ls'", privilegeString.GetPointer());
154 pStmt = CreateStatementN(*__pDb, query);
155 SysTryCatch(NID_SEC, pStmt != null, , E_DATABASE, "[E_DATABASE] An error occurs while creating a database statement.");
157 pEnum = ExecuteStatementN(*__pDb, pStmt);
160 if (pEnum->MoveNext() == E_SUCCESS)
162 r = pEnum->GetStringAt(0, name);
170 SysLog(NID_SEC, "Privilege information is not found. [%ls]", privilegeString.GetPointer());
173 StringTokenizer strTok(__privilegeId, L"/");
174 while(strTok.HasMoreTokens() == true)
176 strTok.GetNextToken(displayName);
190 _PrivilegeInfoImpl::GetDescription(const String& privilege) const
193 result r = E_SUCCESS;
194 DbStatement* pStmt = null;
195 DbEnumerator* pEnum = null;
198 String privilegeURI = L"http://tizen.org/privilege/";
200 String privilegeString;
202 SysTryCatch(NID_SEC, (privilege.GetLength()) > (privilegeURI.GetLength()), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
204 privilege.SubString(0, privilegeURI.GetLength(), uriString);
205 SysTryCatch(NID_SEC, uriString.Equals(privilegeURI, true), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
207 privilege.SubString(privilegeURI.GetLength(), privilege.GetLength()-privilegeURI.GetLength(), privilegeString);
208 query.Format(1024, L"SELECT DESCRIPTION FROM Privileges WHERE PRIVILEGE = '%ls'", privilegeString.GetPointer());
210 pStmt = CreateStatementN(*__pDb, query);
211 SysTryCatch(NID_SEC, pStmt != null, , E_DATABASE, "[E_DATABASE] An error occurs while creating a database statement.");
213 pEnum = ExecuteStatementN(*__pDb, pStmt);
216 if (pEnum->MoveNext() == E_SUCCESS)
218 r = pEnum->GetStringAt(0, description);
226 description.Append("Undefined");
237 _PrivilegeInfoImpl::CreateStatementN(Database& db, const String& query)
239 result r = E_SUCCESS;
240 DbStatement* pStmt = null;
242 for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
244 pStmt = db.CreateStatementN(query);
247 if (r != E_OBJECT_LOCKED)
253 SysLog(NID_SEC, "RetryCount[%d] CreateStatementN - E_OBJECT_LOCKED", i);
264 _PrivilegeInfoImpl::ExecuteStatementN(Database& db, const DbStatement* pStmt)
266 result r = E_SUCCESS;
267 DbEnumerator* pEnum = null;
269 for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
271 pEnum = db.ExecuteStatementN(*pStmt);
274 if (r != E_OBJECT_LOCKED)
280 SysLog(NID_SEC, "RetryCount[%d] ExecuteStatementN - E_OBJECT_LOCKED", i);
291 _PrivilegeInfoImpl::CheckExternalPrivilege(const Tizen::Base::String& privilegeId)
293 result r = E_SUCCESS;
297 DbStatement* pStmt = null;
298 DbEnumerator* pEnum = null;
300 Database* pDb = new Database;
301 SysTryReturn(NID_SEC, pDb != null, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
303 r = pDb->Construct(EXTERNAL_PRIVILEGE_DATABASE_FILE_NAME, false);
304 SysTryCatch(NID_SEC, r == E_SUCCESS, flag = false, E_DATABASE, "External PrivilegeDb is not exist.");
306 query.Format(1024, L"SELECT PRIVILEGE_ID FROM PrivilegeInfo WHERE PRIVILEGE_ID = '%ls'", privilegeId.GetPointer());
308 pStmt = CreateStatementN(*pDb, query);
309 SysTryCatch(NID_SEC, pStmt != null, flag = false, E_DATABASE, "[E_DATABASE] An error occurs while creating a database statement.");
311 pEnum = ExecuteStatementN(*pDb, pStmt);
314 if (pEnum->MoveNext() == E_SUCCESS)
325 SysLog(NID_SEC, "[%ls] is not exist in PrivilegeDb.", privilegeId.GetPointer());
337 _PrivilegeInfoImpl::Construct(const Tizen::Base::String& privilegeId)
339 result r = E_SUCCESS;
341 String privilegeURI = L"http://tizen.org/privilege/";
342 String privilegeSubStringURI;
343 String privilegeSubString;
346 privilegeId.SubString(0, privilegeURI.GetLength(), privilegeSubStringURI);
347 bool validStringFlag = false;
349 if (privilegeSubStringURI.Equals(privilegeURI, true))
351 privilegeId.SubString(privilegeURI.GetLength(), privilegeId.GetLength() - privilegeURI.GetLength(), privilegeSubString);
352 for (index = 0; index < _MAX_PRIVILEGE_ENUM; index++)
354 if (wcscmp(privilegeListTable[index].privilegeString, privilegeSubString.GetPointer()) == 0)
356 validStringFlag = true;
362 if (validStringFlag != true)
364 if (CheckExternalPrivilege(privilegeId))
366 validStringFlag = true;
370 SysTryReturnResult(NID_SEC, validStringFlag == true, E_INVALID_ARG, "Invalid privilege ID [%ls]", privilegeId.GetPointer());
373 SysTryReturnResult(NID_SEC, validStringFlag == true, E_SYSTEM, "The method cannot proceed due to a severe system error.");
375 __privilegeId = privilegeId;
381 _PrivilegeInfoImpl::GetId(void) const
383 return __privilegeId;
387 _PrivilegeInfoImpl::GetDisplayName(void) const
389 return GetName(__privilegeId);
393 _PrivilegeInfoImpl::GetDescription(void) const
395 return GetDescription(__privilegeId);
398 } } // Tizen::Security