X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsecurity%2FFSec_PrivilegeInfo.cpp;h=bc6621c1bb50177e6b1a650e3c5453f61e686d03;hb=f0b4d984b5d29a81ae54a1f310fd8baf3ac822d5;hp=873a1baf0975dcb245bea6bc671044c00cb61648;hpb=92220ef95d9e3ae9ab3b2b47a183f6dfbf6fdbb6;p=platform%2Fframework%2Fnative%2Fappfw.git diff --git a/src/security/FSec_PrivilegeInfo.cpp b/src/security/FSec_PrivilegeInfo.cpp index 873a1ba..bc6621c 100644 --- a/src/security/FSec_PrivilegeInfo.cpp +++ b/src/security/FSec_PrivilegeInfo.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include "FSec_PrivilegeInfo.h" @@ -76,7 +78,7 @@ _PrivilegeInfo::Construct(const AppId& appId, const byte* pBitwisePrivilege, con std::unique_ptr pEnum(null); - r = __privilegeList.Construct(); + r = __privilegeList.Construct(32, 0.75); SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred."); pEnum.reset(pPrivilegeList->GetEnumeratorN()); @@ -84,8 +86,22 @@ _PrivilegeInfo::Construct(const AppId& appId, const byte* pBitwisePrivilege, con while (pEnum->MoveNext() == E_SUCCESS) { - String* tempString = static_cast< String* >(pEnum->GetCurrent()); - __privilegeList.Add(new String(*tempString)); + int ret = PRVMGR_ERR_NONE; + char* pPrivilegeLevel = null; + std::unique_ptr pPrivilegeId(null); + String* pTempString = static_cast< String* >(pEnum->GetCurrent()); + + pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(*pTempString)); + SysTryReturnResult(NID_SEC, pPrivilegeId != null, E_SYSTEM, "An unexpected system error occurred."); + + ret = privilege_info_get_external_privilege_level(static_cast(pPrivilegeId.get()), &pPrivilegeLevel); + SysTryReturnResult(NID_SEC, ret == PRVMGR_ERR_NONE, E_SYSTEM, "An unexpected system error occurred."); + + __privilegeList.Add((new String(*pTempString)), (new String(pPrivilegeLevel))); + if (pPrivilegeLevel != null) + { + free(pPrivilegeLevel); + } } return r; @@ -133,7 +149,7 @@ _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, SysTryReturnResult(NID_SEC, __apiVisibility >= 0, E_SYSTEM, "An unexpected system error occurred."); std::unique_ptr pEnum(null); - r = __privilegeList.Construct(); + r = __privilegeList.Construct(32, 0.75); SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred."); pEnum.reset(pPrivilegeList->GetEnumeratorN()); @@ -141,8 +157,22 @@ _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, while (pEnum->MoveNext() == E_SUCCESS) { - String* tempString = static_cast< String* >(pEnum->GetCurrent()); - __privilegeList.Add(new String(*tempString)); + int ret = PRVMGR_ERR_NONE; + char* pPrivilegeLevel = null; + std::unique_ptr pPrivilegeId(null); + String* pTempString = static_cast< String* >(pEnum->GetCurrent()); + + pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(*pTempString)); + SysTryReturnResult(NID_SEC, pPrivilegeId != null, E_SYSTEM, "An unexpected system error occurred."); + + ret = privilege_info_get_external_privilege_level(static_cast(pPrivilegeId.get()), &pPrivilegeLevel); + SysTryReturnResult(NID_SEC, ret == PRVMGR_ERR_NONE, E_SYSTEM, "An unexpected system error occurred."); + + __privilegeList.Add((new String(*pTempString)), (new String(pPrivilegeLevel))); + if (pPrivilegeLevel != null) + { + free(pPrivilegeLevel); + } } return r; @@ -223,7 +253,7 @@ _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, __apiVisibility = visibility; std::unique_ptr pEnum(null); - r = __privilegeList.Construct(); + r = __privilegeList.Construct(32, 0.75); SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred."); pEnum.reset(pPrivilegeList->GetEnumeratorN()); @@ -231,8 +261,22 @@ _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, while (pEnum->MoveNext() == E_SUCCESS) { - String* tempString = static_cast< String* >(pEnum->GetCurrent()); - __privilegeList.Add(new String(*tempString)); + int ret = PRVMGR_ERR_NONE; + char* pPrivilegeLevel = null; + std::unique_ptr pPrivilegeId(null); + String* pTempString = static_cast< String* >(pEnum->GetCurrent()); + + pPrivilegeId.reset(_StringConverter::CopyToCharArrayN(*pTempString)); + SysTryReturnResult(NID_SEC, pPrivilegeId != null, E_SYSTEM, "An unexpected system error occurred."); + + ret = privilege_info_get_external_privilege_level(static_cast(pPrivilegeId.get()), &pPrivilegeLevel); + SysTryReturnResult(NID_SEC, ret == PRVMGR_ERR_NONE, E_SYSTEM, "An unexpected system error occurred."); + + __privilegeList.Add((new String(*pTempString)), (new String(pPrivilegeLevel))); + if (pPrivilegeLevel != null) + { + free(pPrivilegeLevel); + } } return r; @@ -256,19 +300,21 @@ _PrivilegeInfo::CloneN(void) const pPrivilegeInfo->__appId.Append(this->__appId); memcpy(pPrivilegeInfo->__bitwisePrivilege, this->__bitwisePrivilege, pPrivilegeInfo->__bitwiseLength); - std::unique_ptr pEnum(null); - r = pPrivilegeInfo->__privilegeList.Construct(); - SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred."); + std::unique_ptr pEnum(null); + pEnum.reset(this->__privilegeList.GetMapEnumeratorN()); + SysTryCatch(NID_SEC, pEnum != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred."); - pEnum.reset(this->__privilegeList.GetEnumeratorN()); + r = pPrivilegeInfo->__privilegeList.Construct(32, 0.75); SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred."); while (pEnum->MoveNext() == E_SUCCESS) { - String* tempString = static_cast< String* >(pEnum->GetCurrent()); - pPrivilegeInfo->__privilegeList.Add(new String(*tempString)); + String* pTempString = static_cast< String* >(pEnum->GetKey()); + String* pTempLevel = static_cast< String* >(pEnum->GetValue()); + pPrivilegeInfo->__privilegeList.Add((new String(*pTempString)), (new String(*pTempLevel))); } + pPrivilegeInfo->__apiVisibility = this->__apiVisibility; return pPrivilegeInfo; CATCH: @@ -293,16 +339,20 @@ _PrivilegeInfo::Construct(const _PrivilegeInfo& privilegeInfo) __apiVisibility = privilegeInfo.__apiVisibility; - __privilegeList.Construct(); + std::unique_ptr pEnum(null); + pEnum.reset(privilegeInfo.__privilegeList.GetMapEnumeratorN()); + SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred."); + + r = __privilegeList.Construct(32, 0.75); + SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred."); - IEnumerator* pEnum = privilegeInfo.__privilegeList.GetEnumeratorN(); while (pEnum->MoveNext() == E_SUCCESS) { - String* tempString = static_cast< String* >(pEnum->GetCurrent()); - __privilegeList.Add(new String(*tempString)); + String* pTempString = static_cast< String* >(pEnum->GetKey()); + String* pTempLevel = static_cast< String* >(pEnum->GetValue()); + __privilegeList.Add((new String(*pTempString)), (new String(*pTempLevel))); } - delete pEnum; return r; } @@ -431,13 +481,10 @@ _PrivilegeInfo::HasPrivilege(_Privilege privilege) const byte bitwiseTargetPrivilege = 0; byte tempBitwisePrivilege = 0; - if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed + if (visibilityLevelListTable[privilege] > __apiVisibility) { - if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility) - { - SysLog(NID_SEC, "Result : FALSE [Visibility]"); - return ret; - } + SysLog(NID_SEC, "Result : FALSE [Visibility]"); + return ret; } bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit); @@ -465,12 +512,9 @@ _PrivilegeInfo::HasPrivilegeEx(_Privilege privilege) const byte bitwiseTargetPrivilege = 0; byte tempBitwisePrivilege = 0; - if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed + if (visibilityLevelListTable[privilege] > __apiVisibility) { - if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility) - { - return ret; - } + return ret; } bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit); @@ -515,13 +559,22 @@ _PrivilegeInfo::HasPrivilege(const String& privilege) const if (validStringFlag) { ret = HasPrivilege(privilegeListTable[index].privilege); - } else { - ret = __privilegeList.Contains(privilege); + ret = __privilegeList.ContainsKey(privilege); if (ret) { + const String* pPrivilegeLevel = static_cast< const String* >(__privilegeList.GetValue(privilege)); + SysTryReturn(NID_SEC, pPrivilegeLevel != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred."); + + int privilegeLevel = GetPrivilegeLevel(*pPrivilegeLevel); + if (privilegeLevel > __apiVisibility) + { + SysLog(NID_SEC, "Result : FALSE [Visibility]"); + return false; + } + SysLog(NID_SEC, "Result : TRUE"); } else @@ -543,7 +596,7 @@ _PrivilegeInfo::VerifyIntegrity(const AppId& appId, const byte* targetBitwisePri ByteBuffer input; std::unique_ptr pHash(null); std::unique_ptr pChecksumByteBuffer(null); - std::unique_ptr pAppId(null); + std::unique_ptr pAppId(null); SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of %ls is invalid.", appId.GetPointer()); @@ -769,4 +822,19 @@ CATCH: return null; } +int +_PrivilegeInfo::GetPrivilegeLevel(const String& privilegeLevel) +{ + if(privilegeLevel.Equals(String(L"platform"), true)) + { + return _API_VISIBILITY_PLATFORM; + } + else if(privilegeLevel.Equals(String(L"partner"), true)) + { + return _API_VISIBILITY_PARTNER; + } + + return _API_VISIBILITY_PUBLIC; +} + }} //Tizen::Security