新增URI授权打点事件

Signed-off-by: 段嗣钊 <duansizhao@huawei.com>
Change-Id: I9f6d411d384e4333e2001896c2a26e95e3283396
This commit is contained in:
段嗣钊
2024-06-09 19:00:52 +08:00
parent 2baa7f8e86
commit 4844adefc8
10 changed files with 410 additions and 283 deletions
+5 -1
View File
@@ -379,4 +379,8 @@ ATOMIC_SERVICE_DRAWN_COMPLETE:
BUNDLE_NAME: {type: STRING, desc: bundle name}
MODULE_NAME: {type: STRING, desc: module name}
ABILITY_NAME: {type: STRING, desc: ability name}
SHARE_UNPRIVILEGED_FILE_URI:
__BASE: {type: BEHAVIOR, level: MINOR, desc: share unprivileged file uri}
CALLER_BUNDLE_NAME: {type: STRING, desc: caller bundle name}
BUNDLE_NAME: {type: STRING, desc: bundle name}
+5 -1
View File
@@ -99,7 +99,10 @@ enum class EventName {
// atomic service event
CREATE_ATOMIC_SERVICE_PROCESS,
ATOMIC_SERVICE_DRAWN_COMPLETE
ATOMIC_SERVICE_DRAWN_COMPLETE,
// uri permission
SHARE_UNPRIVILEGED_FILE_URI
};
class EventReport {
@@ -118,6 +121,7 @@ public:
static void SendStopServiceEvent(const EventName &eventName, const EventInfo &eventInfo);
static void SendConnectServiceEvent(const EventName &eventName, const EventInfo &eventInfo);
static void SendDisconnectServiceEvent(const EventName &eventName, const EventInfo &eventInfo);
static void SendGrantUriPermissionEvent(const EventName &eventName, const EventInfo &eventInfo);
private:
static std::string ConvertEventName(const EventName &eventName);
+34 -10
View File
@@ -233,6 +233,36 @@ void EventReport::SendAtomicServiceEvent(const EventName &eventName, HiSysEventT
}
}
void EventReport::SendGrantUriPermissionEvent(const EventName &eventName, const EventInfo &eventInfo)
{
std::string name = ConvertEventName(eventName);
if (name == INVALID_EVENT_NAME) {
TAG_LOGE(AAFwkTag::DEFAULT, "invalid eventName: %{public}s", name.c_str());
return;
}
switch (eventName) {
case EventName::GRANT_URI_PERMISSION:
HiSysEventWrite(
HiSysEvent::Domain::AAFWK,
name,
HiSysEventType::BEHAVIOR,
EVENT_KEY_BUNDLE_NAME, eventInfo.bundleName,
EVENT_KEY_CALLER_BUNDLE_NAME, eventInfo.callerBundleName,
EVENT_KEY_URI, eventInfo.uri);
break;
case EventName::SHARE_UNPRIVILEGED_FILE_URI:
HiSysEventWrite(
HiSysEvent::Domain::AAFWK,
name,
HiSysEventType::BEHAVIOR,
EVENT_KEY_CALLER_BUNDLE_NAME, eventInfo.callerBundleName,
EVENT_KEY_BUNDLE_NAME, eventInfo.bundleName);
break;
default:
break;
}
}
void EventReport::SendExtensionEvent(const EventName &eventName, HiSysEventType type, const EventInfo &eventInfo)
{
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
@@ -272,15 +302,6 @@ void EventReport::SendKeyEvent(const EventName &eventName, HiSysEventType type,
}
TAG_LOGI(AAFwkTag::DEFAULT, "name is %{public}s", name.c_str());
switch (eventName) {
case EventName::GRANT_URI_PERMISSION:
HiSysEventWrite(
HiSysEvent::Domain::AAFWK,
name,
type,
EVENT_KEY_BUNDLE_NAME, eventInfo.bundleName,
EVENT_KEY_CALLER_BUNDLE_NAME, eventInfo.callerBundleName,
EVENT_KEY_URI, eventInfo.uri);
break;
case EventName::FA_SHOW_ON_LOCK:
case EventName::START_PRIVATE_ABILITY:
HiSysEventWrite(
@@ -543,7 +564,10 @@ std::string EventReport::ConvertEventName(const EventName &eventName)
"RESTART_PROCESS_BY_SAME_APP", "START_STANDARD_ABILITIES",
// atomic service event
"CREATE_ATOMIC_SERVICE_PROCESS", "ATOMIC_SERVICE_DRAWN_COMPLETE"
"CREATE_ATOMIC_SERVICE_PROCESS", "ATOMIC_SERVICE_DRAWN_COMPLETE",
// uri permission
"SHARE_UNPRIVILEGED_FILE_URI"
};
uint32_t eventIndex = static_cast<uint32_t> (eventName);
if (eventIndex >= sizeof(eventNames) / sizeof(const char*)) {
+1
View File
@@ -31,6 +31,7 @@ libupms_sources = [
"src/tokenid_permission.cpp",
"src/uri_permission_manager_service.cpp",
"src/uri_permission_manager_stub_impl.cpp",
"src/uri_permission_utils.cpp",
]
#build so
@@ -22,8 +22,6 @@
#include <unordered_set>
#include "app_mgr_interface.h"
#include "bundle_mgr_helper.h"
#include "event_report.h"
#include "istorage_manager.h"
#include "tokenid_permission.h"
#include "uri.h"
@@ -96,13 +94,10 @@ public:
int32_t appIndex = 0) override;
bool VerifyUriPermission(const Uri &uri, uint32_t flag, uint32_t tokenId) override;
int32_t GetTokenIdByBundleName(const std::string &bundleName, int32_t appIndex, uint32_t &tokenId);
private:
template<typename T>
void ConnectManager(sptr<T> &mgr, int32_t serviceId);
std::shared_ptr<AppExecFwk::BundleMgrHelper> ConnectManagerHelper();
int32_t GetCurrentAccountId() const;
int GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
TokenId fromTokenId, TokenId targetTokenId, int32_t abilityId);
int AddTempUriPermission(const std::string &uri, unsigned int flag, TokenId fromTokenId,
@@ -122,17 +117,11 @@ private:
int GrantSingleUriPermission(const Uri &uri, unsigned int flag, uint32_t callerTokenId, uint32_t targetTokenId,
int32_t abilityId);
bool SendEvent(uint32_t callerTokenId, uint32_t targetTokenId, std::string &uri);
int32_t CheckCalledBySandBox();
bool CheckUriPermission(Uri uri, uint32_t flag, TokenIdPermission &tokenIdPermission);
bool CheckUriTypeIsValid(Uri uri);
bool CheckAndCreateEventInfo(uint32_t callerTokenId, uint32_t targetTokenId, EventInfo &eventInfo);
bool CheckIsSystemAppByBundleName(std::string &bundleName);
bool CheckIsSystemAppByTokenId(uint32_t tokenId);
std::string GetBundleNameByTokenId(uint32_t tokenId);
int GrantUriPermissionInner(const std::vector<Uri> &uriVec, unsigned int flag, const std::string targetBundleName,
int32_t appIndex, uint32_t initiatorTokenId, int32_t abilityId = -1);
@@ -144,10 +133,6 @@ private:
void HandleUriPermission(
uint64_t tokenId, unsigned int flag, std::vector<PolicyInfo> &docsVec, bool isSystemAppCall);
bool IsFoundationCall();
std::string GetTokenName(uint32_t callerTokenId);
int32_t CheckProxyUriPermission(TokenIdPermission &tokenIdPermission, const Uri &uri, uint32_t flag);
bool AccessMediaUriPermission(TokenIdPermission &tokenIdPermission, const Uri &uri, uint32_t flag);
@@ -156,10 +141,6 @@ private:
int32_t DeleteShareFile(uint32_t targetTokenId, const std::vector<std::string> &uriVec);
bool IsSAOrSystemAppCall();
bool IsLinuxFusionCall();
void RemoveUriRecord(std::vector<std::string> &uriList, const TokenId tokenId, int32_t abilityId);
class ProxyDeathRecipient : public IRemoteObject::DeathRecipient {
@@ -177,7 +158,6 @@ private:
std::mutex mutex_;
std::mutex mgrMutex_;
sptr<AppExecFwk::IAppMgr> appMgr_ = nullptr;
std::shared_ptr<AppExecFwk::BundleMgrHelper> bundleMgrHelper_ = nullptr;
sptr<StorageManager::IStorageManager> storageManager_ = nullptr;
};
} // namespace OHOS::AAFwk
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_ABILITY_RUNTIME_URI_PERMISSION_EVENT_H
#define OHOS_ABILITY_RUNTIME_URI_PERMISSION_EVENT_H
#include "event_report.h"
#include "bundle_mgr_helper.h"
namespace OHOS {
namespace AAFwk {
class UPMSUtils {
public:
static bool SendShareUnPrivilegeUriEvent(uint32_t callTokenId, uint32_t targetTokenId);
static bool SendSystemAppGrantUriPermissionEvent(uint32_t callerTokenId, uint32_t targetTokenId,
const std::vector<std::string> &uriVec, const std::vector<int32_t> &resVec);
static int32_t GetCurrentAccountId();
static bool IsFoundationCall();
static bool IsSAOrSystemAppCall();
static bool IsSystemAppCall(uint32_t tokenId);
static bool CheckIsSystemAppByTokenId(uint32_t tokenId);
static bool GetBundleNameByTokenId(uint32_t tokenId, std::string &bundleName);
static std::string GetCallerNameByTokenId(uint32_t callerTokenId);
static int32_t GetTokenIdByBundleName(const std::string &bundleName, int32_t appIndex, uint32_t &tokenId);
private:
static std::shared_ptr<AppExecFwk::BundleMgrHelper> ConnectManagerHelper();
static bool CheckAndCreateEventInfo(uint32_t callerTokenId, uint32_t targetTokenId, EventInfo &eventInfo);
static bool CheckIsSystemAppByBundleName(std::string &bundleName);
private:
static std::shared_ptr<AppExecFwk::BundleMgrHelper> bundleMgrHelper_;
};
} // OHOS
} // AAFwk
#endif // OHOS_ABILITY_RUNTIME_URI_PERMISSION_EVENT_H
@@ -20,19 +20,18 @@
#include "ability_manager_errors.h"
#include "accesstoken_kit.h"
#include "app_utils.h"
#include "global_constant.h"
#include "hilog_tag_wrapper.h"
#include "hilog_wrapper.h"
#include "if_system_ability_manager.h"
#include "in_process_call_wrapper.h"
#include "ipc_skeleton.h"
#include "iservice_registry.h"
#include "os_account_manager_wrapper.h"
#include "parameter.h"
#include "permission_constants.h"
#include "permission_verification.h"
#include "system_ability_definition.h"
#include "tokenid_kit.h"
#include "uri_permission_utils.h"
#include "want.h"
#define READ_MODE (1<<0)
@@ -42,14 +41,11 @@
namespace OHOS {
namespace AAFwk {
namespace {
constexpr int32_t DEFAULT_USER_ID = 0;
constexpr int32_t ERR_OK = 0;
constexpr uint32_t FLAG_READ_WRITE_URI = Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION;
constexpr uint32_t FLAG_WRITE_URI = Want::FLAG_AUTH_WRITE_URI_PERMISSION;
constexpr uint32_t FLAG_READ_URI = Want::FLAG_AUTH_READ_URI_PERMISSION;
constexpr const char* CLOUND_DOCS_URI_MARK = "?networkid=";
constexpr const char* FOUNDATION_PROCESS_NAME = "foundation";
constexpr const char* LINUX_FUSION_SERVICE = "linux_fusion_service";
}
bool UriPermissionManagerStubImpl::VerifyUriPermission(const Uri &uri, uint32_t flag, uint32_t tokenId)
@@ -58,7 +54,7 @@ bool UriPermissionManagerStubImpl::VerifyUriPermission(const Uri &uri, uint32_t
auto uriStr = uri.ToString();
TAG_LOGD(AAFwkTag::URIPERMMGR, "uri is %{private}s, flag is %{public}u, tokenId is %{public}u",
uriStr.c_str(), flag, tokenId);
if (!IsSAOrSystemAppCall()) {
if (!UPMSUtils::IsSAOrSystemAppCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Only support SA and SystemApp called.");
return false;
}
@@ -85,12 +81,11 @@ bool UriPermissionManagerStubImpl::VerifyUriPermission(const Uri &uri, uint32_t
return false;
}
int UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId, int32_t abilityId)
{
TAG_LOGI(AAFwkTag::URIPERMMGR, "Uri is %{private}s.", uri.ToString().c_str());
if (!IsSAOrSystemAppCall()) {
if (!UPMSUtils::IsSAOrSystemAppCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Only support SA and SystemApp called.");
return CHECK_PERMISSION_FAILED;
}
@@ -103,7 +98,7 @@ int UriPermissionManagerStubImpl::GrantUriPermission(const std::vector<Uri> &uri
{
TAG_LOGI(AAFwkTag::URIPERMMGR, "BundleName is %{public}s, appIndex is %{public}d, size of uriVec is %{public}zu.",
targetBundleName.c_str(), appIndex, uriVec.size());
if (!IsSAOrSystemAppCall()) {
if (!UPMSUtils::IsSAOrSystemAppCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Only support SA and SystemApp called.");
return CHECK_PERMISSION_FAILED;
}
@@ -116,10 +111,7 @@ int UriPermissionManagerStubImpl::GrantUriPermission(const std::vector<Uri> &uri
return ERR_CODE_INVALID_URI_FLAG;
}
if (AppUtils::GetInstance().IsGrantPersistUriPermission()) {
bool isSystemAppCall = PermissionVerification::GetInstance()->IsSystemAppCall();
if (IsFoundationCall()) {
isSystemAppCall = CheckIsSystemAppByTokenId(initiatorTokenId);
}
bool isSystemAppCall = UPMSUtils::IsSystemAppCall(initiatorTokenId);
return GrantUriPermissionFor2In1Inner(
uriVec, flag, targetBundleName, appIndex, isSystemAppCall, initiatorTokenId, abilityId);
}
@@ -133,13 +125,12 @@ int32_t UriPermissionManagerStubImpl::GrantUriPermissionPrivileged(const std::ve
targetBundleName.c_str(), appIndex, uriVec.size());
uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID();
auto callerName = GetTokenName(callerTokenId);
auto callerName = UPMSUtils::GetCallerNameByTokenId(callerTokenId);
TAG_LOGD(AAFwkTag::URIPERMMGR, "callerTokenId is %{public}u, callerName is %{public}s",
callerTokenId, callerName.c_str());
auto permissionName = PermissionConstants::PERMISSION_GRANT_URI_PERMISSION_PRIVILEGED;
if (!PermissionVerification::GetInstance()->VerifyPermissionByTokenId(callerTokenId, permissionName) &&
!IsLinuxFusionCall()) {
if (!PermissionVerification::GetInstance()->VerifyPermissionByTokenId(callerTokenId, permissionName)) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "No permission to call.");
return CHECK_PERMISSION_FAILED;
}
@@ -150,7 +141,7 @@ int32_t UriPermissionManagerStubImpl::GrantUriPermissionPrivileged(const std::ve
}
flag &= FLAG_READ_WRITE_URI;
uint32_t targetTokenId = 0;
auto ret = GetTokenIdByBundleName(targetBundleName, appIndex, targetTokenId);
auto ret = UPMSUtils::GetTokenIdByBundleName(targetBundleName, appIndex, targetTokenId);
if (ret != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Get tokenId failed, bundlename is %{public}s.", targetBundleName.c_str());
return ret;
@@ -168,7 +159,7 @@ int UriPermissionManagerStubImpl::GrantUriPermissionInner(const std::vector<Uri>
TAG_LOGD(AAFwkTag::URIPERMMGR, "Called.");
flag &= FLAG_READ_WRITE_URI;
uint32_t targetTokenId = 0;
auto ret = GetTokenIdByBundleName(targetBundleName, appIndex, targetTokenId);
auto ret = UPMSUtils::GetTokenIdByBundleName(targetBundleName, appIndex, targetTokenId);
if (ret != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "get tokenId of target bundle name failed.");
return ret;
@@ -176,10 +167,10 @@ int UriPermissionManagerStubImpl::GrantUriPermissionInner(const std::vector<Uri>
// recordId will be set default id if the process name is not foundation.
int32_t recordId = -1;
uint32_t appTokenId = IPCSkeleton::GetCallingTokenID();
if (IsFoundationCall()) {
if (UPMSUtils::IsFoundationCall()) {
recordId = abilityId;
appTokenId = initiatorTokenId;
auto callerName = GetTokenName(appTokenId);
auto callerName = UPMSUtils::GetCallerNameByTokenId(appTokenId);
TAG_LOGI(AAFwkTag::URIPERMMGR, "RealTokenId is %{public}u, RealCallerName is %{public}s.",
appTokenId, callerName.c_str());
}
@@ -282,8 +273,8 @@ int UriPermissionManagerStubImpl::AddTempUriPermission(const std::string &uri, u
int UriPermissionManagerStubImpl::GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
TokenId callerTokenId, TokenId targetTokenId, int32_t abilityId)
{
TAG_LOGD(AAFwkTag::URIPERMMGR, "uri = %{private}s, flag = %{public}i, callerTokenId = %{public}i,"
"targetTokenId = %{public}i, abilityId = %{public}i", uri.ToString().c_str(), flag, callerTokenId,
TAG_LOGD(AAFwkTag::URIPERMMGR, "uri = %{private}s, flag = %{public}u, callerTokenId = %{public}u,"
"targetTokenId = %{public}u, abilityId = %{public}d", uri.ToString().c_str(), flag, callerTokenId,
targetTokenId, abilityId);
ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
if (storageManager_ == nullptr) {
@@ -302,7 +293,7 @@ int UriPermissionManagerStubImpl::GrantUriPermissionImpl(const Uri &uri, unsigne
return INNER_ERR;
}
AddTempUriPermission(uriStr, flag, callerTokenId, targetTokenId, abilityId);
SendEvent(callerTokenId, targetTokenId, uriStr);
UPMSUtils::SendSystemAppGrantUriPermissionEvent(callerTokenId, targetTokenId, uriVec, resVec);
return ERR_OK;
}
@@ -320,6 +311,7 @@ int UriPermissionManagerStubImpl::GrantSingleUriPermission(const Uri &uri, unsig
if (!CheckUriPermission(uri, flag, tokenIdPermission)) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "No permission, uri is %{private}s, callerTokenId is %{public}u",
uri.ToString().c_str(), callerTokenId);
UPMSUtils::SendShareUnPrivilegeUriEvent(callerTokenId, targetTokenId);
return CHECK_PERMISSION_FAILED;
}
return GrantUriPermissionImpl(uri, flag, callerTokenId, targetTokenId, abilityId);
@@ -328,7 +320,7 @@ int UriPermissionManagerStubImpl::GrantSingleUriPermission(const Uri &uri, unsig
int UriPermissionManagerStubImpl::GrantBatchUriPermissionImpl(const std::vector<std::string> &uriVec,
unsigned int flag, TokenId callerTokenId, TokenId targetTokenId, int32_t abilityId)
{
TAG_LOGI(AAFwkTag::URIPERMMGR,"callerTokenId is %{public}u, targetTokenId is %{public}u, flag is %{public}i,"
TAG_LOGI(AAFwkTag::URIPERMMGR,"callerTokenId is %{public}u, targetTokenId is %{public}u, flag is %{public}u,"
"list size is %{public}zu", callerTokenId, targetTokenId, flag, uriVec.size());
ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
if (storageManager_ == nullptr) {
@@ -344,8 +336,6 @@ int UriPermissionManagerStubImpl::GrantBatchUriPermissionImpl(const std::vector<
TAG_LOGE(AAFwkTag::URIPERMMGR, "Failed to createShareFile, ret is %{public}u", resVec[0]);
return resVec[0];
}
EventInfo eventInfo;
bool needSendEvent = CheckAndCreateEventInfo(callerTokenId, targetTokenId, eventInfo);
int successCount = 0;
for (size_t i = 0; i < uriVec.size(); i++) {
auto ret = resVec[i];
@@ -354,16 +344,13 @@ int UriPermissionManagerStubImpl::GrantBatchUriPermissionImpl(const std::vector<
continue;
}
AddTempUriPermission(uriVec[i], flag, callerTokenId, targetTokenId, abilityId);
if (needSendEvent) {
eventInfo.uri = uriVec[i];
EventReport::SendKeyEvent(EventName::GRANT_URI_PERMISSION, HiSysEventType::BEHAVIOR, eventInfo);
}
successCount++;
}
TAG_LOGI(AAFwkTag::URIPERMMGR, "total %{public}d uri permissions added.", successCount);
if (successCount == 0) {
return INNER_ERR;
}
UPMSUtils::SendSystemAppGrantUriPermissionEvent(callerTokenId, targetTokenId, uriVec, resVec);
return ERR_OK;
}
@@ -375,6 +362,7 @@ int UriPermissionManagerStubImpl::GrantBatchUriPermission(const std::vector<Uri>
callerTokenId, targetTokenId, flag, abilityId);
TokenIdPermission tokenIdPermission(callerTokenId);
std::vector<std::string> uriStrVec = {};
bool checkUriPermissionFailedFlag = false;
for (const auto &uri : uriVec) {
if (!CheckUriTypeIsValid(uri)) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Check uri type failed, uri is %{private}s", uri.ToString().c_str());
@@ -382,10 +370,14 @@ int UriPermissionManagerStubImpl::GrantBatchUriPermission(const std::vector<Uri>
}
if (!CheckUriPermission(uri, flag, tokenIdPermission)) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "No permission, uri is %{private}s.", uri.ToString().c_str());
checkUriPermissionFailedFlag = true;
continue;
}
uriStrVec.emplace_back(uri.ToString());
}
if (checkUriPermissionFailedFlag) {
UPMSUtils::SendShareUnPrivilegeUriEvent(callerTokenId, targetTokenId);
}
if (uriStrVec.empty()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Valid uri list is empty.");
return INNER_ERR;
@@ -489,7 +481,7 @@ void UriPermissionManagerStubImpl::RevokeUriPermission(const TokenId tokenId, in
{
TAG_LOGI(AAFwkTag::URIPERMMGR,
"Start to remove uri permission, tokenId is %{public}u, abilityId is %{public}d", tokenId, abilityId);
if (!IsFoundationCall()) {
if (!UPMSUtils::IsFoundationCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "No permission to revoke uri permission.");
return;
}
@@ -503,7 +495,7 @@ void UriPermissionManagerStubImpl::RevokeUriPermission(const TokenId tokenId, in
int UriPermissionManagerStubImpl::RevokeAllUriPermissions(uint32_t tokenId)
{
TAG_LOGI(AAFwkTag::URIPERMMGR, "Start to revoke all uri permission, tokenId is %{public}u.", tokenId);
if (!IsFoundationCall()) {
if (!UPMSUtils::IsFoundationCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "No permission to revoke all uri permission.");
return CHECK_PERMISSION_FAILED;
}
@@ -514,7 +506,7 @@ int UriPermissionManagerStubImpl::RevokeAllUriPermissions(uint32_t tokenId)
uint32_t authorityTokenId = 0;
auto authority = Uri(iter->first).GetAuthority();
// uri belong to target tokenId.
auto ret = GetTokenIdByBundleName(authority, 0, authorityTokenId);
auto ret = UPMSUtils::GetTokenIdByBundleName(authority, 0, authorityTokenId);
if (ret == ERR_OK && authorityTokenId == tokenId) {
for (const auto &record : iter->second) {
uriLists[record.targetTokenId].emplace_back(iter->first);
@@ -554,7 +546,7 @@ int UriPermissionManagerStubImpl::RevokeUriPermissionManually(const Uri &uri, co
TAG_LOGI(AAFwkTag::URIPERMMGR,
"Revoke uri permission manually, uri is %{private}s, bundleName is %{public}s, appIndex is %{public}d",
uri.ToString().c_str(), bundleName.c_str(), appIndex);
if (!IsSAOrSystemAppCall()) {
if (!UPMSUtils::IsSAOrSystemAppCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Only support SA and SystemApp called.");
return CHECK_PERMISSION_FAILED;
}
@@ -563,16 +555,15 @@ int UriPermissionManagerStubImpl::RevokeUriPermissionManually(const Uri &uri, co
return ERR_CODE_INVALID_URI_TYPE;
}
uint32_t targetTokenId = 0;
auto ret = GetTokenIdByBundleName(bundleName, appIndex, targetTokenId);
if (ret != ERR_OK) {
if (UPMSUtils::GetTokenIdByBundleName(bundleName, appIndex, targetTokenId) != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "get tokenId by bundle name failed.");
return ret;
return INNER_ERR;
}
auto uriStr = uri.ToString();
auto uriInner = uri;
uint32_t authorityTokenId = 0;
GetTokenIdByBundleName(uriInner.GetAuthority(), 0, authorityTokenId);
UPMSUtils::GetTokenIdByBundleName(uriInner.GetAuthority(), 0, authorityTokenId);
// uri belong to caller or caller is target.
auto callerTokenId = IPCSkeleton::GetCallingTokenID();
bool isRevokeSelfUri = (callerTokenId == targetTokenId || callerTokenId == authorityTokenId);
@@ -619,9 +610,9 @@ std::vector<bool> UriPermissionManagerStubImpl::CheckUriAuthorization(const std:
{
TAG_LOGI(AAFwkTag::URIPERMMGR,
"tokenId is %{public}u, tokenName is %{public}s, flag is %{public}u, size of uris is %{public}zu",
tokenId, GetTokenName(tokenId).c_str(), flag, uriVec.size());
tokenId, UPMSUtils::GetCallerNameByTokenId(tokenId).c_str(), flag, uriVec.size());
std::vector<bool> result(uriVec.size(), false);
if (!IsSAOrSystemAppCall()) {
if (!UPMSUtils::IsSAOrSystemAppCall()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Only support SA and SystemApp called.");
return result;
}
@@ -686,51 +677,6 @@ void UriPermissionManagerStubImpl::ConnectManager(sptr<T> &mgr, int32_t serviceI
}
}
std::shared_ptr<AppExecFwk::BundleMgrHelper> UriPermissionManagerStubImpl::ConnectManagerHelper()
{
if (bundleMgrHelper_ == nullptr) {
bundleMgrHelper_ = DelayedSingleton<AppExecFwk::BundleMgrHelper>::GetInstance();
}
return bundleMgrHelper_;
}
int32_t UriPermissionManagerStubImpl::GetTokenIdByBundleName(const std::string &bundleName, int32_t appIndex,
uint32_t &tokenId)
{
TAG_LOGD(AAFwkTag::URIPERMMGR, "BundleName is %{public}s, appIndex is %{public}d.", bundleName.c_str(), appIndex);
auto bms = ConnectManagerHelper();
if (bms == nullptr) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "The bundleMgrHelper is nullptr.");
return GET_BUNDLE_MANAGER_SERVICE_FAILED;
}
AppExecFwk::BundleInfo bundleInfo;
auto userId = GetCurrentAccountId();
if (appIndex == 0) {
auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
if (!IN_PROCESS_CALL(bms->GetBundleInfo(bundleName, bundleFlag, bundleInfo, userId))) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
if (appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
auto bundleFlag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
if (IN_PROCESS_CALL(bms->GetCloneBundleInfo(bundleName, bundleFlag, appIndex, bundleInfo, userId)) != ERR_OK) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get clone bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
if (IN_PROCESS_CALL(bms->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo) != ERR_OK)) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get sandbox bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
void UriPermissionManagerStubImpl::ProxyDeathRecipient::OnRemoteDied([[maybe_unused]]
const wptr<IRemoteObject>& remote)
{
@@ -740,23 +686,6 @@ void UriPermissionManagerStubImpl::ProxyDeathRecipient::OnRemoteDied([[maybe_unu
}
}
int32_t UriPermissionManagerStubImpl::GetCurrentAccountId() const
{
std::vector<int32_t> osActiveAccountIds;
auto ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
QueryActiveOsAccountIds(osActiveAccountIds);
if (ret != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "QueryActiveOsAccountIds error.");
return DEFAULT_USER_ID;
}
if (osActiveAccountIds.empty()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "%{public}s, the QueryActiveOsAccountIds is empty, no accounts.", __func__);
return DEFAULT_USER_ID;
}
return osActiveAccountIds.front();
}
int UriPermissionManagerStubImpl::GrantUriPermissionFor2In1Inner(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex, bool isSystemAppCall, uint32_t initiatorTokenId,
int32_t abilityId)
@@ -794,7 +723,7 @@ int UriPermissionManagerStubImpl::GrantUriPermissionFor2In1Inner(const std::vect
}
}
uint32_t tokenId = 0;
auto ret = GetTokenIdByBundleName(targetBundleName, appIndex, tokenId);
auto ret = UPMSUtils::GetTokenIdByBundleName(targetBundleName, appIndex, tokenId);
if (ret != ERR_OK) {
return ret;
}
@@ -839,146 +768,13 @@ void UriPermissionManagerStubImpl::HandleUriPermission(
}
}
bool UriPermissionManagerStubImpl::IsFoundationCall()
{
auto callerTokenId = IPCSkeleton::GetCallingTokenID();
TAG_LOGD(AAFwkTag::ABILITYMGR, "callerTokenId is %{public}u", callerTokenId);
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerTokenId);
if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
TAG_LOGI(AAFwkTag::ABILITYMGR, "Is not native call");
return false;
}
Security::AccessToken::NativeTokenInfo nativeInfo;
auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
if (result != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetNativeTokenInfo failed, callerTokenId is %{public}u.", callerTokenId);
return false;
}
TAG_LOGD(AAFwkTag::URIPERMMGR, "Caller process name : %{public}s", nativeInfo.processName.c_str());
return nativeInfo.processName == FOUNDATION_PROCESS_NAME;
}
bool UriPermissionManagerStubImpl::IsLinuxFusionCall()
{
auto callerTokenId = IPCSkeleton::GetCallingTokenID();
TAG_LOGD(AAFwkTag::ABILITYMGR, "callerTokenId is %{public}u", callerTokenId);
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerTokenId);
if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
TAG_LOGI(AAFwkTag::ABILITYMGR, "Is not native call");
return false;
}
Security::AccessToken::NativeTokenInfo nativeInfo;
auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
if (result != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetNativeTokenInfo failed, callerTokenId is %{public}u.", callerTokenId);
return false;
}
TAG_LOGD(AAFwkTag::URIPERMMGR, "Caller process name : %{public}s", nativeInfo.processName.c_str());
return nativeInfo.processName == LINUX_FUSION_SERVICE;
}
std::string UriPermissionManagerStubImpl::GetTokenName(uint32_t callerTokenId)
{
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerTokenId);
if (tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
Security::AccessToken::NativeTokenInfo nativeInfo;
auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
if (result != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetNativeTokenInfo failed, callerTokenId is %{public}u.", callerTokenId);
return "";
}
return nativeInfo.processName;
}
return GetBundleNameByTokenId(callerTokenId);
}
bool UriPermissionManagerStubImpl::SendEvent(uint32_t callerTokenId, uint32_t targetTokenId, std::string &uri)
{
EventInfo eventInfo;
eventInfo.uri = uri;
if (CheckAndCreateEventInfo(callerTokenId, targetTokenId, eventInfo)) {
EventReport::SendKeyEvent(EventName::GRANT_URI_PERMISSION, HiSysEventType::BEHAVIOR, eventInfo);
return true;
}
return false;
}
bool UriPermissionManagerStubImpl::CheckAndCreateEventInfo(uint32_t callerTokenId, uint32_t targetTokenId,
EventInfo &eventInfo)
{
std::string callerBundleName = GetBundleNameByTokenId(callerTokenId);
std::string targetBundleName = GetBundleNameByTokenId(targetTokenId);
if (callerBundleName.empty() || targetBundleName.empty()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Caller bundle name is empty or target bundle name is empty.");
return false;
}
auto isSystemAppCall = CheckIsSystemAppByBundleName(callerBundleName);
auto targetIsSystemApp = CheckIsSystemAppByBundleName(targetBundleName);
if (!isSystemAppCall || targetIsSystemApp) {
TAG_LOGD(AAFwkTag::URIPERMMGR, "Caller is not system app or callee is system app.");
return false;
}
TAG_LOGI(AAFwkTag::URIPERMMGR, "Send Grant_Uri_Permission event.");
eventInfo.callerBundleName = callerBundleName;
eventInfo.bundleName = targetBundleName;
return true;
}
std::string UriPermissionManagerStubImpl::GetBundleNameByTokenId(uint32_t tokenId)
{
Security::AccessToken::HapTokenInfo hapInfo;
auto ret = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo);
if (ret != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetHapTokenInfo failed, ret is %{public}i.", ret);
return "";
}
return hapInfo.bundleName;
}
bool UriPermissionManagerStubImpl::CheckIsSystemAppByBundleName(std::string &bundleName)
{
auto bundleMgrHelper = ConnectManagerHelper();
if (bundleMgrHelper == nullptr) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "The bundleMgrHelper is nullptr.");
return false;
}
AppExecFwk::ApplicationInfo appInfo;
if (!IN_PROCESS_CALL(bundleMgrHelper->GetApplicationInfo(bundleName,
AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, GetCurrentAccountId(), appInfo))) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Get application info failed.");
return false;
}
auto isSystemApp = Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(appInfo.accessTokenIdEx);
TAG_LOGD(AAFwkTag::URIPERMMGR, "BundleName is %{public}s, isSystemApp = %{public}i", bundleName.c_str(),
static_cast<int32_t>(isSystemApp));
return isSystemApp;
}
bool UriPermissionManagerStubImpl::CheckIsSystemAppByTokenId(uint32_t tokenId)
{
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
TAG_LOGI(AAFwkTag::ABILITYMGR, "tokenType is %{public}d.", tokenType);
return false;
}
auto bundleName = GetBundleNameByTokenId(tokenId);
if (!bundleName.empty()) {
return CheckIsSystemAppByBundleName(bundleName);
}
return false;
}
bool UriPermissionManagerStubImpl::CheckUriPermission(Uri uri, uint32_t flag, TokenIdPermission &tokenIdPermission)
{
auto &&authority = uri.GetAuthority();
TAG_LOGD(AAFwkTag::URIPERMMGR, "Authority of uri is %{public}s", authority.c_str());
if (IsLinuxFusionCall()) {
TAG_LOGI(AAFwkTag::URIPERMMGR, "Caller is linux_fusion_service.");
return true;
}
if (uri.GetScheme() == "content") {
TAG_LOGI(AAFwkTag::URIPERMMGR, "uri is content type.");
return IsFoundationCall();
return UPMSUtils::IsFoundationCall();
}
if (authority == "docs") {
return AccessDocsUriPermission(tokenIdPermission, uri, flag);
@@ -987,7 +783,7 @@ bool UriPermissionManagerStubImpl::CheckUriPermission(Uri uri, uint32_t flag, To
return AccessMediaUriPermission(tokenIdPermission, uri, flag);
}
uint32_t authorityTokenId = 0;
if (GetTokenIdByBundleName(authority, 0, authorityTokenId) != ERR_OK) {
if (UPMSUtils::GetTokenIdByBundleName(authority, 0, authorityTokenId) != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "Get tokenId of %{public}s failed.", authority.c_str());
return false;
}
@@ -1060,11 +856,5 @@ bool UriPermissionManagerStubImpl::CheckUriTypeIsValid(Uri uri)
}
return true;
}
bool UriPermissionManagerStubImpl::IsSAOrSystemAppCall()
{
return PermissionVerification::GetInstance()->IsSystemAppCall() ||
PermissionVerification::GetInstance()->IsSACall();
}
} // namespace AAFwk
} // namespace OHOS
@@ -0,0 +1,261 @@
/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "uri_permission_utils.h"
#include "ability_manager_errors.h"
#include "accesstoken_kit.h"
#include "global_constant.h"
#include "hilog_tag_wrapper.h"
#include "in_process_call_wrapper.h"
#include "ipc_skeleton.h"
#include "os_account_manager_wrapper.h"
#include "permission_verification.h"
#include "tokenid_kit.h"
namespace OHOS {
namespace AAFwk {
namespace {
constexpr int32_t DEFAULT_USER_ID = 0;
constexpr const char* FOUNDATION_PROCESS_NAME = "foundation";
}
std::shared_ptr<AppExecFwk::BundleMgrHelper> UPMSUtils::ConnectManagerHelper()
{
if (bundleMgrHelper_ == nullptr) {
bundleMgrHelper_ = DelayedSingleton<AppExecFwk::BundleMgrHelper>::GetInstance();
}
return bundleMgrHelper_;
}
bool UPMSUtils::SendShareUnPrivilegeUriEvent(uint32_t callerTokenId, uint32_t targetTokenId)
{
std::string callerBundleName;
if (!GetBundleNameByTokenId(callerTokenId, callerBundleName)) {
return false;
}
std::string targetBundleName;
if (!GetBundleNameByTokenId(targetTokenId, targetBundleName)) {
return false;
}
AAFwk::EventInfo eventInfo;
eventInfo.callerBundleName = callerBundleName;
eventInfo.bundleName = targetBundleName;
TAG_LOGD(AAFwkTag::URIPERMMGR, "Send SHARE_UNPRIVILEGED_FILE_URI Event.");
AAFwk::EventReport::SendGrantUriPermissionEvent(AAFwk::EventName::SHARE_UNPRIVILEGED_FILE_URI, eventInfo);
return true;
}
bool UPMSUtils::SendSystemAppGrantUriPermissionEvent(uint32_t callerTokenId, uint32_t targetTokenId,
const std::vector<std::string> &uriVec, const std::vector<int32_t> &resVec)
{
EventInfo eventInfo;
if (!CheckAndCreateEventInfo(callerTokenId, targetTokenId, eventInfo)) {
return false;
}
for (size_t i = 0; i < resVec.size(); i++) {
if (resVec[i] == 0 || resVec[i] == -EEXIST) {
eventInfo.uri = uriVec[i];
EventReport::SendGrantUriPermissionEvent(EventName::GRANT_URI_PERMISSION, eventInfo);
}
}
TAG_LOGD(AAFwkTag::URIPERMMGR, "Send GRANT_URI_PERMISSION Event.");
return true;
}
bool UPMSUtils::CheckAndCreateEventInfo(uint32_t callerTokenId, uint32_t targetTokenId,
EventInfo &eventInfo)
{
std::string callerBundleName;
if (!GetBundleNameByTokenId(callerTokenId, callerBundleName)) {
TAG_LOGD(AAFwkTag::URIPERMMGR, "get caller bundle name failed.");
return false;
}
if (!CheckIsSystemAppByBundleName(callerBundleName)) {
TAG_LOGD(AAFwkTag::URIPERMMGR, "caller is not system.");
return false;
}
std::string targetBundleName;
if (!GetBundleNameByTokenId(targetTokenId, targetBundleName)) {
TAG_LOGD(AAFwkTag::URIPERMMGR, "get target bundle name failed.");
return false;
}
if (CheckIsSystemAppByBundleName(targetBundleName)) {
TAG_LOGD(AAFwkTag::URIPERMMGR, "target is system app.");
return false;
}
eventInfo.callerBundleName = callerBundleName;
eventInfo.bundleName = targetBundleName;
return true;
}
int32_t UPMSUtils::GetCurrentAccountId()
{
std::vector<int32_t> osActiveAccountIds;
auto ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
QueryActiveOsAccountIds(osActiveAccountIds);
if (ret != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "QueryActiveOsAccountIds error.");
return DEFAULT_USER_ID;
}
if (osActiveAccountIds.empty()) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "the QueryActiveOsAccountIds is empty, no accounts.");
return DEFAULT_USER_ID;
}
return osActiveAccountIds.front();
}
bool UPMSUtils::IsFoundationCall()
{
auto callerTokenId = IPCSkeleton::GetCallingTokenID();
TAG_LOGD(AAFwkTag::ABILITYMGR, "callerTokenId is %{public}u", callerTokenId);
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerTokenId);
if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
TAG_LOGI(AAFwkTag::ABILITYMGR, "Is not native call");
return false;
}
Security::AccessToken::NativeTokenInfo nativeInfo;
auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
if (result != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetNativeTokenInfo failed, callerTokenId is %{public}u.", callerTokenId);
return false;
}
TAG_LOGD(AAFwkTag::URIPERMMGR, "Caller process name : %{public}s", nativeInfo.processName.c_str());
return nativeInfo.processName == FOUNDATION_PROCESS_NAME;
}
bool UPMSUtils::IsSAOrSystemAppCall()
{
return PermissionVerification::GetInstance()->IsSystemAppCall() ||
PermissionVerification::GetInstance()->IsSACall();
}
bool UPMSUtils::IsSystemAppCall(uint32_t tokenId)
{
if (UPMSUtils::IsFoundationCall()) {
return UPMSUtils::CheckIsSystemAppByTokenId(tokenId);
}
return PermissionVerification::GetInstance()->IsSystemAppCall();
}
bool UPMSUtils::CheckIsSystemAppByBundleName(std::string &bundleName)
{
auto bundleMgrHelper = ConnectManagerHelper();
if (bundleMgrHelper == nullptr) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "The bundleMgrHelper is nullptr.");
return false;
}
AppExecFwk::ApplicationInfo appInfo;
if (!IN_PROCESS_CALL(bundleMgrHelper->GetApplicationInfo(bundleName,
AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, GetCurrentAccountId(), appInfo))) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Get application info failed.");
return false;
}
auto isSystemApp = Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(appInfo.accessTokenIdEx);
TAG_LOGD(AAFwkTag::URIPERMMGR, "BundleName is %{public}s, isSystemApp = %{public}d", bundleName.c_str(),
static_cast<int32_t>(isSystemApp));
return isSystemApp;
}
bool UPMSUtils::CheckIsSystemAppByTokenId(uint32_t tokenId)
{
std::string bundleName;
if (GetBundleNameByTokenId(tokenId, bundleName)) {
return CheckIsSystemAppByBundleName(bundleName);
}
return false;
}
bool UPMSUtils::GetBundleNameByTokenId(uint32_t tokenId, std::string &bundleName)
{
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
if (tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
Security::AccessToken::HapTokenInfo hapInfo;
auto ret = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo);
if (ret != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetHapTokenInfo failed, ret is %{public}d.", ret);
return false;
}
bundleName = hapInfo.bundleName;
return true;
}
return false;
}
std::string UPMSUtils::GetCallerNameByTokenId(uint32_t tokenId)
{
auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
if (tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
// for SA, return process name
Security::AccessToken::NativeTokenInfo nativeInfo;
auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, nativeInfo);
if (result != ERR_OK) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetNativeTokenInfo failed, tokenId is %{public}u.", tokenId);
return "";
}
return nativeInfo.processName;
}
if (tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
// for application, return bundle name
Security::AccessToken::HapTokenInfo hapInfo;
auto ret = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo);
if (ret != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) {
TAG_LOGE(AAFwkTag::URIPERMMGR, "GetHapTokenInfo failed, ret is %{public}d.", ret);
return "";
}
return hapInfo.bundleName;
}
return "";
}
int32_t UPMSUtils::GetTokenIdByBundleName(const std::string &bundleName, int32_t appIndex, uint32_t &tokenId)
{
TAG_LOGD(AAFwkTag::URIPERMMGR, "BundleName is %{public}s, appIndex is %{public}d.", bundleName.c_str(), appIndex);
auto bms = ConnectManagerHelper();
if (bms == nullptr) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "The bundleMgrHelper is nullptr.");
return GET_BUNDLE_MANAGER_SERVICE_FAILED;
}
AppExecFwk::BundleInfo bundleInfo;
auto userId = GetCurrentAccountId();
if (appIndex == 0) {
auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
if (!IN_PROCESS_CALL(bms->GetBundleInfo(bundleName, bundleFlag, bundleInfo, userId))) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
if (appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
auto bundleFlag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
if (IN_PROCESS_CALL(bms->GetCloneBundleInfo(bundleName, bundleFlag, appIndex, bundleInfo, userId)) != ERR_OK) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get clone bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
if (IN_PROCESS_CALL(bms->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo) != ERR_OK)) {
TAG_LOGW(AAFwkTag::URIPERMMGR, "Failed to get sandbox bundle info.");
return GET_BUNDLE_INFO_FAILED;
}
tokenId = bundleInfo.applicationInfo.accessTokenId;
return ERR_OK;
}
std::shared_ptr<AppExecFwk::BundleMgrHelper> UPMSUtils::bundleMgrHelper_ = nullptr;
} // namespace AAFwk
} // namespace OHOS
@@ -91,6 +91,8 @@ HWTEST_F(EventReportTest, ConvertEventName_0100, TestSize.Level0)
"CREATE_ATOMIC_SERVICE_PROCESS");
EXPECT_EQ(EventReport::ConvertEventName(EventName::ATOMIC_SERVICE_DRAWN_COMPLETE),
"ATOMIC_SERVICE_DRAWN_COMPLETE");
EXPECT_EQ(EventReport::ConvertEventName(EventName::SHARE_UNPRIVILEGED_FILE_URI),
"SHARE_UNPRIVILEGED_FILE_URI");
}
/**
@@ -29,6 +29,7 @@
#include "tokenid_kit.h"
#define private public
#include "uri_permission_manager_stub_impl.h"
#include "uri_permission_utils.h"
#undef private
using namespace testing;
@@ -448,16 +449,27 @@ HWTEST_F(UriPermissionImplTest, Upms_VerifyUriPermission_001, TestSize.Level1)
* Feature: URIPermissionManagerService
* Function: ConnectManager
* SubFunction: NA
* FunctionPoints: URIPermissionManagerService SendEvent
* FunctionPoints: URIPermissionManagerService SendSystemAppGrantUriPermissionEvent
*/
HWTEST_F(UriPermissionImplTest, Upms_SendEvent_001, TestSize.Level1)
HWTEST_F(UriPermissionImplTest, Upms_SendSystemAppGrantUriPermissionEvent_001, TestSize.Level1)
{
auto upms = std::make_unique<UriPermissionManagerStubImpl>();
ASSERT_NE(upms, nullptr);
MyFlag::flag_ |= MyFlag::IS_SA_CALL;
std::string uri = "file://com.example.test/data/storage/el2/base/haps/entry/files/test_A.txt";
std::string targetBundleName = "com.example.test";
auto ret = upms->SendEvent(1001, 1002, uri);
std::vector<std::string> uriVec = { "file://com.example.test/data/storage/el2/base/haps/entry/files/test_A.txt" };
const std::vector<int32_t> resVec = { ERR_OK };
auto ret = UPMSUtils::SendSystemAppGrantUriPermissionEvent(1001, 1002, uriVec, resVec);
ASSERT_EQ(ret, false);
}
/*
* Feature: URIPermissionManagerService
* Function: ConnectManager
* SubFunction: NA
* FunctionPoints: URIPermissionManagerService SendShareUnPrivilegeUriEvent
*/
HWTEST_F(UriPermissionImplTest, Upms_SendShareUnPrivilegeUriEvent_001, TestSize.Level1)
{
MyFlag::flag_ |= MyFlag::IS_SA_CALL;
auto ret = UPMSUtils::SendShareUnPrivilegeUriEvent(1001, 1002);
ASSERT_EQ(ret, false);
}