Signed-off-by: yuwenze <yuwenze1@huawei.com>
Change-Id: If8099cd38eb86cf0e2bb42d9d7ddbb3675c24fe2
This commit is contained in:
yuwenze
2024-02-18 15:25:15 +08:00
parent 987efbc4ff
commit 1089e9832f
9 changed files with 103 additions and 115 deletions
@@ -36,7 +36,8 @@ public:
* @param flag Want::FLAG_AUTH_READ_URI_PERMISSION or Want::FLAG_AUTH_WRITE_URI_PERMISSION.
* @param targetBundleName The user of uri.
*/
int GrantUriPermission(const Uri &uri, unsigned int flag, const std::string targetBundleName, int32_t appIndex = 0);
int GrantUriPermission(const Uri &uri, unsigned int flag, const std::string targetBundleName, int32_t appIndex = 0,
uint32_t initiatorTokenId = 0);
/**
* @brief Authorize the uri permission of to targetBundleName.
@@ -46,10 +47,10 @@ public:
* @param targetBundleName The user of uri.
*/
int GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0);
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0);
/**
* @brief Authorize the uri permission to targetBundleName for 2in1, only supports foundation process calls.
* @brief Authorize the uri permission to targetBundleName for 2in1, only supports AbilityManagerService calls.
*
* @param uriVec The file urilist.
* @param flag Want::FLAG_AUTH_READ_URI_PERMISSION or Want::FLAG_AUTH_WRITE_URI_PERMISSION.
@@ -35,7 +35,7 @@ public:
* @return Returns true if the authorization is successful, otherwise returns false.
*/
virtual int GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) = 0;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) = 0;
/**
* @brief Authorize the uri permission to targetBundleName.
@@ -46,7 +46,7 @@ public:
* @return Returns true if the authorization is successful, otherwise returns false.
*/
virtual int GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) = 0;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) = 0;
/**
* @brief Authorize the uri permission to targetBundleName for 2in1, only supports foundation process calls.
@@ -28,10 +28,10 @@ public:
virtual ~UriPermissionManagerProxy() = default;
virtual int GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) override;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) override;
virtual int GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) override;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) override;
virtual int GrantUriPermissionFor2In1(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex = 0, bool isSystemAppCall = false) override;
virtual void RevokeUriPermission(const Security::AccessToken::AccessTokenID tokenId) override;
@@ -35,18 +35,18 @@ UriPermissionManagerClient& UriPermissionManagerClient::GetInstance()
}
int UriPermissionManagerClient::GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("targetBundleName :%{public}s", targetBundleName.c_str());
auto uriPermMgr = ConnectUriPermService();
if (uriPermMgr) {
return uriPermMgr->GrantUriPermission(uri, flag, targetBundleName, appIndex);
return uriPermMgr->GrantUriPermission(uri, flag, targetBundleName, appIndex, initiatorTokenId);
}
return INNER_ERR;
}
int UriPermissionManagerClient::GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("targetBundleName: %{public}s, uriVec size: %{public}zu", targetBundleName.c_str(), uriVec.size());
if (uriVec.size() == 0 || uriVec.size() > MAX_URI_COUNT) {
@@ -55,7 +55,7 @@ int UriPermissionManagerClient::GrantUriPermission(const std::vector<Uri> &uriVe
}
auto uriPermMgr = ConnectUriPermService();
if (uriPermMgr) {
return uriPermMgr->GrantUriPermission(uriVec, flag, targetBundleName, appIndex);
return uriPermMgr->GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
}
return INNER_ERR;
}
@@ -28,7 +28,7 @@ UriPermissionManagerProxy::UriPermissionManagerProxy(const sptr<IRemoteObject> &
: IRemoteProxy<IUriPermissionManager>(impl) {}
int UriPermissionManagerProxy::GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("UriPermissionManagerProxy::GrantUriPermission is called.");
MessageParcel data;
@@ -52,6 +52,10 @@ int UriPermissionManagerProxy::GrantUriPermission(const Uri &uri, unsigned int f
HILOG_ERROR("Write appIndex failed.");
return INNER_ERR;
}
if (!data.WriteUint32(initiatorTokenId)) {
HILOG_ERROR("Write initiatorTokenId failed.");
return INNER_ERR;
}
MessageParcel reply;
MessageOption option;
int error = SendTransactCmd(UriPermMgrCmd::ON_GRANT_URI_PERMISSION, data, reply, option);
@@ -63,7 +67,7 @@ int UriPermissionManagerProxy::GrantUriPermission(const Uri &uri, unsigned int f
}
int UriPermissionManagerProxy::GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("UriPermissionManagerProxy::GrantUriPermission is called.");
MessageParcel data;
@@ -93,6 +97,10 @@ int UriPermissionManagerProxy::GrantUriPermission(const std::vector<Uri> &uriVec
HILOG_ERROR("Write appIndex failed.");
return INNER_ERR;
}
if (!data.WriteUint32(initiatorTokenId)) {
HILOG_ERROR("Write initiatorTokenId failed.");
return INNER_ERR;
}
MessageParcel reply;
MessageOption option;
int error = SendTransactCmd(UriPermMgrCmd::ON_BATCH_GRANT_URI_PERMISSION, data, reply, option);
@@ -89,7 +89,8 @@ int UriPermissionManagerStub::HandleGrantUriPermission(MessageParcel &data, Mess
auto flag = data.ReadInt32();
auto targetBundleName = data.ReadString();
auto appIndex = data.ReadInt32();
int result = GrantUriPermission(*uri, flag, targetBundleName, appIndex);
auto initiatorTokenId = data.ReadUint32();
int result = GrantUriPermission(*uri, flag, targetBundleName, appIndex, initiatorTokenId);
reply.WriteInt32(result);
return ERR_OK;
}
@@ -113,7 +114,8 @@ int UriPermissionManagerStub::HandleBatchGrantUriPermission(MessageParcel &data,
auto flag = data.ReadInt32();
auto targetBundleName = data.ReadString();
auto appIndex = data.ReadInt32();
int result = GrantUriPermission(uriVec, flag, targetBundleName, appIndex);
auto initiatorTokenId = data.ReadUint32();
int result = GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
reply.WriteInt32(result);
return ERR_OK;
}
+10 -8
View File
@@ -1642,8 +1642,9 @@ void AbilityRecord::SendSandboxSavefileResult(const Want &want, int resultCode,
continue;
}
Uri uri(uriStr);
uint32_t initiatorTokenId = IPCSkeleton::GetCallingTokenID();
auto ret = IN_PROCESS_CALL(UriPermissionManagerClient::GetInstance().GrantUriPermission(uri,
Want::FLAG_AUTH_WRITE_URI_PERMISSION, abilityInfo_.bundleName, appIndex_));
Want::FLAG_AUTH_WRITE_URI_PERMISSION, abilityInfo_.bundleName, appIndex_, initiatorTokenId));
if (ret != ERR_OK) {
HILOG_WARN("GrantUriPermission failed");
}
@@ -2972,9 +2973,8 @@ void AbilityRecord::GrantUriPermissionInner(Want &want, std::vector<std::string>
uriVecMap[flag].emplace_back(uri);
}
for (const auto &item : uriVecMap) {
auto ret = IN_PROCESS_CALL(
AAFwk::UriPermissionManagerClient::GetInstance().GrantUriPermission(item.second, item.first,
targetBundleName, appIndex_));
auto ret = IN_PROCESS_CALL(UriPermissionManagerClient::GetInstance().GrantUriPermission(item.second, item.first,
targetBundleName, appIndex_, callerTokenId));
if (ret == ERR_OK) {
isGrantedUriPermission_ = true;
}
@@ -2995,9 +2995,10 @@ bool AbilityRecord::GrantPermissionToShell(const std::vector<std::string> &strUr
}
}
uint32_t initiatorTokenId = IPCSkeleton::GetCallingTokenID();
for (auto&& uri : uriVec) {
auto ret = IN_PROCESS_CALL(
AAFwk::UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, flag, targetPkg, appIndex_));
auto ret = IN_PROCESS_CALL(UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, flag, targetPkg,
appIndex_, initiatorTokenId));
if (ret == ERR_OK) {
isGrantedUriPermission_ = true;
}
@@ -3081,8 +3082,9 @@ void AbilityRecord::GrantDmsUriPermission(Want &want, std::string targetBundleNa
HILOG_ERROR("uri is not distributed path");
continue;
}
auto ret = IN_PROCESS_CALL(
UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, want.GetFlags(), targetBundleName));
uint32_t initiatorTokenId = IPCSkeleton::GetCallingTokenID();
auto ret = IN_PROCESS_CALL(UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, want.GetFlags(),
targetBundleName, appIndex_, initiatorTokenId));
if (ret == 0) {
isGrantedUriPermission_ = true;
}
@@ -37,7 +37,7 @@ struct GrantInfo {
unsigned int flag;
const uint32_t fromTokenId;
const uint32_t targetTokenId;
int autoremove;
uint32_t autoRemove;
};
struct PolicyInfo final {
@@ -54,9 +54,9 @@ public:
void Init();
int GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) override;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) override;
int GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex = 0) override;
const std::string targetBundleName, int32_t appIndex = 0, uint32_t initiatorTokenId = 0) override;
int GrantUriPermissionFor2In1(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex = 0, bool isSystemAppCall = false) override;
void RevokeUriPermission(const TokenId tokenId) override;
@@ -75,13 +75,13 @@ private:
std::shared_ptr<AppExecFwk::BundleMgrHelper> ConnectManagerHelper();
int32_t GetCurrentAccountId() const;
int GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
TokenId fromTokenId, TokenId targetTokenId, int autoremove);
TokenId fromTokenId, TokenId targetTokenId, uint32_t autoRemove);
int GetUriPermissionFlag(const Uri &uri, unsigned int flag, uint32_t fromTokenId,
uint32_t targetTokenId, unsigned int &newFlag);
int AddTempUriPermission(const std::string &uri, unsigned int flag, TokenId fromTokenId,
TokenId targetTokenId, int autoremove);
int DeletTempUriPermission(const std::string &uri, uint32_t flag, uint32_t targetTokenId);
int DeletTempUriPermissionAndShareFile(const std::string &uri, uint32_t targetTokenId);
TokenId targetTokenId, uint32_t autoRemove);
int DeleteTempUriPermission(const std::string &uri, uint32_t flag, uint32_t targetTokenId);
int DeleteTempUriPermissionAndShareFile(const std::string &uri, uint32_t fromTokenId, uint32_t targetTokenId);
void GetUriPermissionBatchFlag(const std::vector<Uri> &uriVec,
unsigned int flag, uint32_t targetTokenId,
@@ -89,10 +89,10 @@ private:
std::unordered_map<uint32_t, std::vector<uint32_t>> &fromTokenIdVecMap);
int GrantBatchUriPermissionImpl(const std::vector<std::string> &uriVec, unsigned int flag,
std::vector<uint32_t> &fromTokenIdVec, TokenId targetTokenId, int autoremove);
TokenId initiatorTokenId, TokenId targetTokenId, uint32_t autoRemove);
int GrantSingleUriPermission(const Uri &uri, unsigned int flag,
const std::string &targetBundleName, int autoremove, int32_t appIndex);
const std::string &targetBundleName, uint32_t autoRemove, int32_t appIndex, uint32_t initiatorTokenId);
void InitPersistableUriPermissionConfig();
@@ -101,14 +101,14 @@ private:
int CheckRule(unsigned int flag);
int GrantUriPermissionInner(
const std::vector<Uri> &uriVec, unsigned int flag, const std::string targetBundleName, int32_t appIndex);
int GrantUriPermissionInner(const std::vector<Uri> &uriVec, unsigned int flag, const std::string targetBundleName,
int32_t appIndex, uint32_t initiatorTokenId);
int CheckGrantUriPermissionFor2In1(
const std::vector<Uri> &uriVec, unsigned int flag, const std::string &targetBundleName, int32_t appIndex);
int CheckGrantUriPermissionFor2In1(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex, uint32_t initiatorTokenId);
int GrantUriPermissionFor2In1Inner(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex, bool isSystemAppCall);
const std::string &targetBundleName, int32_t appIndex, bool isSystemAppCall, uint32_t initiatorTokenId = 0);
void HandleUriPermission(
uint64_t tokenId, unsigned int flag, std::vector<PolicyInfo> &docsVec, bool isSystemAppCall);
@@ -114,25 +114,25 @@ bool UriPermissionManagerStubImpl::IsAuthorizationUriAllowed(uint32_t fromTokenI
}
int UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("CALL: appIndex is %{public}d.", appIndex);
std::vector<Uri> uriVec = { uri };
return GrantUriPermission(uriVec, flag, targetBundleName, appIndex);
return GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
}
int UriPermissionManagerStubImpl::GrantUriPermission(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex)
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("CALL: appIndex is %{public}d, uriVec size is %{public}zu", appIndex, uriVec.size());
if (AppUtils::GetInstance().JudgePCDevice()) {
return CheckGrantUriPermissionFor2In1(uriVec, flag, targetBundleName, appIndex);
return CheckGrantUriPermissionFor2In1(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
}
return GrantUriPermissionInner(uriVec, flag, targetBundleName, appIndex);
return GrantUriPermissionInner(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
}
int UriPermissionManagerStubImpl::GrantUriPermissionInner(
const std::vector<Uri> &uriVec, unsigned int flag, const std::string targetBundleName, int32_t appIndex)
int UriPermissionManagerStubImpl::GrantUriPermissionInner(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("Called.");
auto checkResult = CheckRule(flag);
@@ -143,15 +143,19 @@ int UriPermissionManagerStubImpl::GrantUriPermissionInner(
auto targetTokenId = GetTokenIdByBundleName(targetBundleName, appIndex);
Security::AccessToken::NativeTokenInfo nativeInfo;
Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
// autoremove will be set to 1 if the process name is foundation.
HILOG_DEBUG("callerprocessName : %{public}s", nativeInfo.processName.c_str());
int autoremove = 0;
// autoRemove will be set to 1 if the process name is foundation.
HILOG_DEBUG("callerProcessName : %{public}s", nativeInfo.processName.c_str());
uint32_t autoRemove = 0;
uint32_t appTokenId = 0;
if (nativeInfo.processName == "foundation") {
autoremove = 1;
autoRemove = 1;
appTokenId = initiatorTokenId;
} else {
appTokenId = IPCSkeleton::GetCallingTokenID();
}
// reserve origin process
if (uriVec.size() == 1) {
auto singleRet = GrantSingleUriPermission(uriVec[0], flag, targetBundleName, autoremove, appIndex);
auto singleRet = GrantSingleUriPermission(uriVec[0], flag, targetBundleName, autoRemove, appIndex, appTokenId);
if (singleRet == ERR_OK) {
SendEvent(uriVec[0], targetBundleName, targetTokenId);
}
@@ -166,8 +170,7 @@ int UriPermissionManagerStubImpl::GrantUriPermissionInner(
}
int ret = INNER_ERR;
for (const auto &item : uriVecMap) {
auto tempRet = GrantBatchUriPermissionImpl(item.second, item.first, fromTokenIdVecMap[item.first],
targetTokenId, autoremove);
auto tempRet = GrantBatchUriPermissionImpl(item.second, item.first, appTokenId, targetTokenId, autoRemove);
if (tempRet == ERR_OK) {
ret = ERR_OK;
SendEvent(uriVec[0], targetBundleName, targetTokenId, item.second);
@@ -279,11 +282,11 @@ int UriPermissionManagerStubImpl::GetUriPermissionFlag(const Uri &uri, unsigned
}
int UriPermissionManagerStubImpl::AddTempUriPermission(const std::string &uri, unsigned int flag,
TokenId fromTokenId, TokenId targetTokenId, int autoremove)
TokenId fromTokenId, TokenId targetTokenId, uint32_t autoRemove)
{
std::lock_guard<std::mutex> guard(mutex_);
auto search = uriMap_.find(uri);
GrantInfo info = { flag, fromTokenId, targetTokenId, autoremove };
GrantInfo info = { flag, fromTokenId, targetTokenId, autoRemove };
if (search == uriMap_.end()) {
HILOG_INFO("Insert an uri r/w permission.");
std::list<GrantInfo> infoList = { info };
@@ -294,7 +297,7 @@ int UriPermissionManagerStubImpl::AddTempUriPermission(const std::string &uri, u
for (auto& item : infoList) {
if (item.fromTokenId == fromTokenId && item.targetTokenId == targetTokenId) {
HILOG_DEBUG("Item: flag = %{public}i, fromTokenId = %{public}i, targetTokenId = %{public}i,\
autoremove = %{public}i", item.flag, item.fromTokenId, item.targetTokenId, item.autoremove);
autoRemove = %{public}i", item.flag, item.fromTokenId, item.targetTokenId, item.autoRemove);
if ((flag & (item.flag | Want::FLAG_AUTH_READ_URI_PERMISSION)) == 0) {
HILOG_INFO("Update uri r/w permission.");
item.flag = flag;
@@ -308,7 +311,7 @@ int UriPermissionManagerStubImpl::AddTempUriPermission(const std::string &uri, u
return ERR_OK;
}
int UriPermissionManagerStubImpl::DeletTempUriPermission(const std::string &uri, uint32_t flag,
int UriPermissionManagerStubImpl::DeleteTempUriPermission(const std::string &uri, uint32_t flag,
uint32_t targetTokenId)
{
if ((flag & Want::FLAG_AUTH_WRITE_URI_PERMISSION) != 0) {
@@ -344,10 +347,10 @@ int UriPermissionManagerStubImpl::DeletTempUriPermission(const std::string &uri,
}
int UriPermissionManagerStubImpl::GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
TokenId fromTokenId, TokenId targetTokenId, int autoremove)
TokenId fromTokenId, TokenId targetTokenId, uint32_t autoRemove)
{
HILOG_INFO("uri = %{private}s, flag = %{public}i, fromTokenId = %{public}i, targetTokenId = %{public}i,\
autoremove = %{public}i", uri.ToString().c_str(), flag, fromTokenId, targetTokenId, autoremove);
autoRemove = %{public}i", uri.ToString().c_str(), flag, fromTokenId, targetTokenId, autoRemove);
ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
if (storageManager_ == nullptr) {
HILOG_ERROR("ConnectManager failed");
@@ -374,16 +377,16 @@ int UriPermissionManagerStubImpl::GrantUriPermissionImpl(const Uri &uri, unsigne
auto addInfoRet = uriPermissionRdb_->AddGrantInfo(uriStr, flag, fromTokenId, targetTokenId);
if (addInfoRet == ERR_OK) {
// delete temporary uri permission
return DeletTempUriPermission(uriStr, flag, targetTokenId);
return DeleteTempUriPermission(uriStr, flag, targetTokenId);
}
return addInfoRet;
}
// grant temporary uri permission
return AddTempUriPermission(uriStr, flag, fromTokenId, targetTokenId, autoremove);
return AddTempUriPermission(uriStr, flag, fromTokenId, targetTokenId, autoRemove);
}
int UriPermissionManagerStubImpl::GrantSingleUriPermission(const Uri &uri, unsigned int flag,
const std::string &targetBundleName, int autoremove, int32_t appIndex)
const std::string &targetBundleName, uint32_t autoRemove, int32_t appIndex, uint32_t initiatorTokenId)
{
Uri uri_inner = uri;
auto&& scheme = uri_inner.GetScheme();
@@ -399,7 +402,7 @@ int UriPermissionManagerStubImpl::GrantSingleUriPermission(const Uri &uri, unsig
if (ret != ERR_OK || tmpFlag == 0) {
return ret;
}
return GrantUriPermissionImpl(uri, tmpFlag, fromTokenId, targetTokenId, autoremove);
return GrantUriPermissionImpl(uri, tmpFlag, initiatorTokenId, targetTokenId, autoRemove);
}
void UriPermissionManagerStubImpl::GetUriPermissionBatchFlag(const std::vector<Uri> &uriVec,
@@ -435,7 +438,7 @@ void UriPermissionManagerStubImpl::GetUriPermissionBatchFlag(const std::vector<U
}
int UriPermissionManagerStubImpl::GrantBatchUriPermissionImpl(const std::vector<std::string> &uriVec,
unsigned int flag, std::vector<uint32_t> &fromTokenIdVec, TokenId targetTokenId, int autoremove)
unsigned int flag, TokenId initiatorTokenId, TokenId targetTokenId, uint32_t autoRemove)
{
HILOG_DEBUG("CALL: targetTokenId is %{public}d, flag is %{public}i, uriVec size is %{public}zu",
targetTokenId, flag, uriVec.size());
@@ -466,17 +469,16 @@ int UriPermissionManagerStubImpl::GrantBatchUriPermissionImpl(const std::vector<
continue;
}
auto uriStr = uriVec[i];
auto fromTokenId = fromTokenIdVec[i];
if (persistableFlag == 0) {
auto addTempInfoRet = AddTempUriPermission(uriStr, flag, fromTokenId, targetTokenId, autoremove);
auto addTempInfoRet = AddTempUriPermission(uriStr, flag, initiatorTokenId, targetTokenId, autoRemove);
successCount += (addTempInfoRet == ERR_OK ? 1 : 0);
continue;
}
// grant persistable uri permission
auto addInfoRet = uriPermissionRdb_->AddGrantInfo(uriStr, flag, fromTokenId, targetTokenId);
auto addInfoRet = uriPermissionRdb_->AddGrantInfo(uriStr, flag, initiatorTokenId, targetTokenId);
if (addInfoRet == ERR_OK) {
successCount++;
DeletTempUriPermission(uriStr, flag, targetTokenId);
DeleteTempUriPermission(uriStr, flag, targetTokenId);
}
}
HILOG_DEBUG("total %{public}i uri permissions added.", successCount);
@@ -499,7 +501,7 @@ void UriPermissionManagerStubImpl::RevokeUriPermission(const TokenId tokenId)
for (auto iter = uriMap_.begin(); iter != uriMap_.end();) {
auto& list = iter->second;
for (auto it = list.begin(); it != list.end(); it++) {
if (it->targetTokenId == tokenId && it->autoremove) {
if (it->targetTokenId == tokenId && it->autoRemove) {
HILOG_INFO("Erase an info form list.");
list.erase(it);
uriList.emplace_back(iter->first);
@@ -535,7 +537,7 @@ int UriPermissionManagerStubImpl::RevokeAllUriPermissions(uint32_t tokenId)
std::map<unsigned int, std::vector<std::string>> uriLists;
{
std::lock_guard<std::mutex> guard(mutex_);
// delte temporary uri permission
// delete temporary uri permission
for (auto iter = uriMap_.begin(); iter != uriMap_.end();) {
auto& list = iter->second;
for (auto it = list.begin(); it != list.end();) {
@@ -588,53 +590,25 @@ int UriPermissionManagerStubImpl::RevokeUriPermissionManually(const Uri &uri, co
HILOG_WARN("only support file uri.");
return ERR_CODE_INVALID_URI_TYPE;
}
auto uriTokenId = GetTokenIdByBundleName(authority, 0);
auto tokenId = GetTokenIdByBundleName(bundleName, 0);
auto callerTokenId = IPCSkeleton::GetCallingTokenID();
auto permission = IsAuthorizationUriAllowed(callerTokenId);
bool authorityFlag = authority == "media" || authority == "docs";
if (!authorityFlag && (uriTokenId != callerTokenId) && (tokenId != callerTokenId)) {
HILOG_WARN("UriPermissionManagerStubImpl::RevokeUriPermission: No permission for revoke uri.");
return CHECK_PERMISSION_FAILED;
HILOG_DEBUG("callerTokenId is %{public}u, targetTokenId is %{public}u", callerTokenId, tokenId);
if (tokenId == callerTokenId) {
return DeleteTempUriPermissionAndShareFile(uriStr, 0, tokenId);
}
if (authorityFlag && !permission && tokenId != callerTokenId) {
HILOG_WARN("UriPermissionManagerStubImpl::RevokeUriPermission: No permission for revoke uri.");
return CHECK_PERMISSION_FAILED;
}
if (authorityFlag && isGrantPersistableUriPermissionEnable_) {
// delete persistable grant info
ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
if (storageManager_ == nullptr) {
HILOG_ERROR("ConnectStorageManager failed");
return INNER_ERR;
}
if (uriPermissionRdb_ == nullptr) {
HILOG_ERROR("rdb manager is nullptr");
return INNER_ERR;
}
auto ret = uriPermissionRdb_->RemoveGrantInfo(uriStr, tokenId, storageManager_);
if (ret != ERR_OK) {
HILOG_ERROR("remove persistable uri permission failed.");
return INNER_ERR;
}
}
// delete temporary grant info
return DeletTempUriPermissionAndShareFile(uriStr, tokenId);
return DeleteTempUriPermissionAndShareFile(uriStr, callerTokenId, tokenId);
}
int UriPermissionManagerStubImpl::DeletTempUriPermissionAndShareFile(const std::string &uri, uint32_t targetTokenId)
int UriPermissionManagerStubImpl::DeleteTempUriPermissionAndShareFile(const std::string &uri, uint32_t fromTokenId,
uint32_t targetTokenId)
{
ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
if (storageManager_ == nullptr) {
HILOG_ERROR("ConnectStorageManager failed");
return INNER_ERR;
}
std::vector<std::string> uriList;
std::lock_guard<std::mutex> guard(mutex_);
std::lock_guard<std::mutex> guard(mutex_);
auto search = uriMap_.find(uri);
if (search == uriMap_.end()) {
HILOG_INFO("URI does not exist on uri map.");
@@ -642,16 +616,17 @@ int UriPermissionManagerStubImpl::DeletTempUriPermissionAndShareFile(const std::
}
auto& list = search->second;
for (auto it = list.begin(); it != list.end(); it++) {
if (it->targetTokenId == targetTokenId) {
HILOG_INFO("Erase an info form list.");
if ((it->fromTokenId == fromTokenId || fromTokenId == 0) && it->targetTokenId == targetTokenId) {
HILOG_INFO("Notify storageMGR to delete shareFile.");
std::vector<std::string> uriList;
uriList.emplace_back(search->first);
if (storageManager_->DeleteShareFile(targetTokenId, uriList) == ERR_OK) {
list.erase(it);
break;
} else {
auto procedureRet = storageManager_->DeleteShareFile(targetTokenId, uriList);
if (procedureRet != ERR_OK) {
HILOG_ERROR("DeleteShareFile failed");
return INNER_ERR;
return procedureRet;
}
list.erase(it);
break;
}
}
if (list.size() == 0) {
@@ -796,8 +771,8 @@ void UriPermissionManagerStubImpl::SendEvent(const Uri &uri, const std::string &
}
}
int UriPermissionManagerStubImpl::CheckGrantUriPermissionFor2In1(
const std::vector<Uri> &uriVec, unsigned int flag, const std::string &targetBundleName, int32_t appIndex)
int UriPermissionManagerStubImpl::CheckGrantUriPermissionFor2In1(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex, uint32_t initiatorTokenId)
{
HILOG_DEBUG("Called.");
bool isSystemAppCall = PermissionVerification::GetInstance()->IsSystemAppCall();
@@ -806,11 +781,11 @@ int UriPermissionManagerStubImpl::CheckGrantUriPermissionFor2In1(
HILOG_ERROR("Not system application or SA call.");
return INNER_ERR;
}
return GrantUriPermissionFor2In1Inner(uriVec, flag, targetBundleName, appIndex, isSystemAppCall);
return GrantUriPermissionFor2In1Inner(uriVec, flag, targetBundleName, appIndex, isSystemAppCall, initiatorTokenId);
}
int UriPermissionManagerStubImpl::GrantUriPermissionFor2In1Inner(const std::vector<Uri> &uriVec, unsigned int flag,
const std::string &targetBundleName, int32_t appIndex, bool isSystemAppCall)
const std::string &targetBundleName, int32_t appIndex, bool isSystemAppCall, uint32_t initiatorTokenId)
{
HILOG_DEBUG("Called, uriVec size is %{public}zu", uriVec.size());
auto checkResult = CheckRule(flag);
@@ -845,7 +820,7 @@ int UriPermissionManagerStubImpl::GrantUriPermissionFor2In1Inner(const std::vect
HILOG_DEBUG("The tokenId is %{public}u", tokenId);
HandleUriPermission(tokenId, flag, docsVec, isSystemAppCall);
if (!otherVec.empty()) {
return GrantUriPermissionInner(otherVec, flag, targetBundleName, appIndex);
return GrantUriPermissionInner(otherVec, flag, targetBundleName, appIndex, initiatorTokenId);
}
return ERR_OK;
}