#include <FBase_StringConverter.h>
#include <FSec_AccessControlTypes.h>
#include <FBaseUtilStringTokenizer.h>
+#include <FBase_StringConverter.h>
+#include <privilege_info.h>
#include "FSec_PrivilegeInfoImpl.h"
namespace Tizen { namespace Security
{
-_PrivilegeInfoImpl* _PrivilegeInfoImpl::__pPrivilegeInfoImplInstance = null;
-
_PrivilegeInfoImpl::_PrivilegeInfoImpl(void)
: __pDb(null)
{
return;
}
-result
-_PrivilegeInfoImpl::Construct(void)
-{
- ClearLastResult();
- result r = E_SUCCESS;
-
- r = CheckDatabase();
- SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
-
- Database* pDb = new Database;
- SysTryReturnResult(NID_SEC, pDb != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
-
- r = pDb->Construct(PRIVILEGE_DESCRIPTION_DATABASE_FILE_NAME, false);
- SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
-
- __pDb = pDb;
-
- return E_SUCCESS;
-}
-
-result
-_PrivilegeInfoImpl::CheckDatabase(void)
-{
- if (File::IsFileExist(PRIVILEGE_DESCRIPTION_DATABASE_FILE_NAME) != true)
- {
- SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] Privilege information DB is not exist.");
- return E_SYSTEM;
- }
-
- return E_SUCCESS;
-}
-
-
-void
-_PrivilegeInfoImpl::InitInstance(void)
-{
- result r = E_SUCCESS;
- static _PrivilegeInfoImpl instance;
-
- ClearLastResult();
-
- r = instance.Construct();
- SysTryReturnVoidResult(NID_SEC, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-
- __pPrivilegeInfoImplInstance = &instance;
-}
-
-_PrivilegeInfoImpl*
-_PrivilegeInfoImpl::GetInstance(void)
-{
- result r = E_SUCCESS;
- static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
-
- ClearLastResult();
-
- if (__pPrivilegeInfoImplInstance == null)
- {
- pthread_once(&onceBlock, InitInstance);
-
- r = GetLastResult();
- if (IsFailed(r))
- {
- onceBlock = PTHREAD_ONCE_INIT;
- __pPrivilegeInfoImplInstance = null;
- SysLogException(NID_SEC, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
- }
- }
-
- return __pPrivilegeInfoImplInstance;
-}
-
String
_PrivilegeInfoImpl::GetName(const String& privilege) const
{
- String name;
- result r = E_SUCCESS;
- DbStatement* pStmt = null;
- DbEnumerator* pEnum = null;
- String query;
-
- String privilegeURI = L"http://tizen.org/privilege/";
- String uriString;
- String privilegeString;
-
- SysTryCatch(NID_SEC, (privilege.GetLength()) > (privilegeURI.GetLength()), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
+ int ret = 0;
+ char* pPrivilegeDisplayName = null;
+ std::unique_ptr<char[]> pPrivilegeId(null);
+ String displayName;
+ pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(privilege));
+ SysTryReturn(NID_SEC, pPrivilegeId != null, displayName, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
- privilege.SubString(0, privilegeURI.GetLength(), uriString);
- SysTryCatch(NID_SEC, uriString.Equals(privilegeURI, true), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
+ ret = privilege_info_get_privilege_display_name(pPrivilegeId.get(), &pPrivilegeDisplayName);
+ displayName.Append(pPrivilegeDisplayName);
- privilege.SubString(privilegeURI.GetLength(), privilege.GetLength()-privilegeURI.GetLength(), privilegeString);
- query.Format(1024, L"SELECT NAME FROM Privileges WHERE PRIVILEGE = '%ls'", privilegeString.GetPointer());
-
- pStmt = CreateStatementN(*__pDb, query);
- SysTryCatch(NID_SEC, pStmt != null, , E_DATABASE, "[E_DATABASE] An error occurs while creating a database statement.");
-
- pEnum = ExecuteStatementN(*__pDb, pStmt);
- if (pEnum != null)
+ if (pPrivilegeDisplayName != null)
{
- if (pEnum->MoveNext() == E_SUCCESS)
- {
- r = pEnum->GetStringAt(0, name);
- }
-
- delete pEnum;
- pEnum = null;
- }
- else
- {
- SysLog(NID_SEC, "Privilege information is not found. [%ls]", privilegeString.GetPointer());
-
- String displayName;
- StringTokenizer strTok(__privilegeId, L"/");
- while(strTok.HasMoreTokens() == true)
- {
- strTok.GetNextToken(displayName);
- }
-
- name = displayName;
+ free(pPrivilegeDisplayName);
}
-
-CATCH:
- delete pStmt;
- pStmt = null;
-
- return name;
+ return displayName;
}
String
_PrivilegeInfoImpl::GetDescription(const String& privilege) const
{
+ int ret = 0;
+ char* pPrivilegeDescription = null;
+ std::unique_ptr<char[]> pPrivilegeId(null);
String description;
- result r = E_SUCCESS;
- DbStatement* pStmt = null;
- DbEnumerator* pEnum = null;
- String query;
-
- String privilegeURI = L"http://tizen.org/privilege/";
- String uriString;
- String privilegeString;
- SysTryCatch(NID_SEC, (privilege.GetLength()) > (privilegeURI.GetLength()), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
+ pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(privilege));
+ SysTryReturn(NID_SEC, pPrivilegeId != null, description, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
- privilege.SubString(0, privilegeURI.GetLength(), uriString);
- SysTryCatch(NID_SEC, uriString.Equals(privilegeURI, true), ,E_INVALID_ARG, "[E_INVALID_ARG] Invalid privilege string : %ls", privilege.GetPointer());
-
- privilege.SubString(privilegeURI.GetLength(), privilege.GetLength()-privilegeURI.GetLength(), privilegeString);
- query.Format(1024, L"SELECT DESCRIPTION FROM Privileges WHERE PRIVILEGE = '%ls'", privilegeString.GetPointer());
-
- pStmt = CreateStatementN(*__pDb, query);
- SysTryCatch(NID_SEC, pStmt != null, , E_DATABASE, "[E_DATABASE] An error occurs while creating a database statement.");
-
- pEnum = ExecuteStatementN(*__pDb, pStmt);
- if (pEnum != null)
- {
- if (pEnum->MoveNext() == E_SUCCESS)
- {
- r = pEnum->GetStringAt(0, description);
- }
+ ret = privilege_info_get_privilege_description(pPrivilegeId.get(), &pPrivilegeDescription);
+ description.Append(pPrivilegeDescription);
- delete pEnum;
- pEnum = null;
- }
- else
+ if (pPrivilegeDescription != null)
{
- description.Append("Undefined");
+ free(pPrivilegeDescription);
}
-
-CATCH:
- delete pStmt;
- pStmt = null;
-
return description;
}
-DbStatement*
-_PrivilegeInfoImpl::CreateStatementN(Database& db, const String& query)
-{
- result r = E_SUCCESS;
- DbStatement* pStmt = null;
-
- for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
- {
- pStmt = db.CreateStatementN(query);
- r = GetLastResult();
-
- if (r != E_OBJECT_LOCKED)
- {
- break;
- }
- else
- {
- SysLog(NID_SEC, "RetryCount[%d] CreateStatementN - E_OBJECT_LOCKED", i);
- delete pStmt;
- pStmt = null;
- usleep(50000);
- }
- }
-
- return pStmt;
-}
-
-DbEnumerator*
-_PrivilegeInfoImpl::ExecuteStatementN(Database& db, const DbStatement* pStmt)
-{
- result r = E_SUCCESS;
- DbEnumerator* pEnum = null;
-
- for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
- {
- pEnum = db.ExecuteStatementN(*pStmt);
- r = GetLastResult();
-
- if (r != E_OBJECT_LOCKED)
- {
- break;
- }
- else
- {
- SysLog(NID_SEC, "RetryCount[%d] ExecuteStatementN - E_OBJECT_LOCKED", i);
- delete pEnum;
- pEnum = null;
- usleep(50000);
- }
- }
-
- return pEnum;
-}
-
bool
_PrivilegeInfoImpl::CheckExternalPrivilege(const Tizen::Base::String& privilegeId)
{
}
SysTryReturnResult(NID_SEC, validStringFlag == true, E_INVALID_ARG, "Invalid privilege ID [%ls]", privilegeId.GetPointer());
-
- r = Construct();
- SysTryReturnResult(NID_SEC, validStringFlag == true, E_SYSTEM, "The method cannot proceed due to a severe system error.");
-
__privilegeId = privilegeId;
return r;
return GetDescription(__privilegeId);
}
+DbStatement*
+_PrivilegeInfoImpl::CreateStatementN(Database& db, const String& query)
+{
+ result r = E_SUCCESS;
+ DbStatement* pStmt = null;
+
+ for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
+ {
+ pStmt = db.CreateStatementN(query);
+ r = GetLastResult();
+
+ if (r != E_OBJECT_LOCKED)
+ {
+ break;
+ }
+ else
+ {
+ SysLog(NID_SEC, "RetryCount[%d] CreateStatementN - E_OBJECT_LOCKED", i);
+ delete pStmt;
+ pStmt = null;
+ usleep(50000);
+ }
+ }
+
+ return pStmt;
+}
+
+DbEnumerator*
+_PrivilegeInfoImpl::ExecuteStatementN(Database& db, const DbStatement* pStmt)
+{
+ result r = E_SUCCESS;
+ DbEnumerator* pEnum = null;
+
+ for (int i = 0; i < MAX_DATABASE_RETRY_COUNT; i++)
+ {
+ pEnum = db.ExecuteStatementN(*pStmt);
+ r = GetLastResult();
+
+ if (r != E_OBJECT_LOCKED)
+ {
+ break;
+ }
+ else
+ {
+ SysLog(NID_SEC, "RetryCount[%d] ExecuteStatementN - E_OBJECT_LOCKED", i);
+ delete pEnum;
+ pEnum = null;
+ usleep(50000);
+ }
+ }
+
+ return pEnum;
+}
+
} } // Tizen::Security