diff --git a/interfaces/inner_api/uri_permission/include/uri_permission_manager_client.h b/interfaces/inner_api/uri_permission/include/uri_permission_manager_client.h index 2db6024691..daed3d5e97 100644 --- a/interfaces/inner_api/uri_permission/include/uri_permission_manager_client.h +++ b/interfaces/inner_api/uri_permission/include/uri_permission_manager_client.h @@ -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 &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. diff --git a/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h b/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h index d32653c564..b76ad333f5 100644 --- a/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h +++ b/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h @@ -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 &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. diff --git a/interfaces/inner_api/uri_permission/include/uri_permission_manager_proxy.h b/interfaces/inner_api/uri_permission/include/uri_permission_manager_proxy.h index 04be10bb94..e18fc4d86b 100644 --- a/interfaces/inner_api/uri_permission/include/uri_permission_manager_proxy.h +++ b/interfaces/inner_api/uri_permission/include/uri_permission_manager_proxy.h @@ -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 &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 &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; diff --git a/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp b/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp index f05cceb1d0..97956740af 100644 --- a/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp +++ b/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp @@ -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 &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 &uriVe } auto uriPermMgr = ConnectUriPermService(); if (uriPermMgr) { - return uriPermMgr->GrantUriPermission(uriVec, flag, targetBundleName, appIndex); + return uriPermMgr->GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId); } return INNER_ERR; } diff --git a/interfaces/inner_api/uri_permission/src/uri_permission_manager_proxy.cpp b/interfaces/inner_api/uri_permission/src/uri_permission_manager_proxy.cpp index b9d4b8a6fe..1695f04e9b 100644 --- a/interfaces/inner_api/uri_permission/src/uri_permission_manager_proxy.cpp +++ b/interfaces/inner_api/uri_permission/src/uri_permission_manager_proxy.cpp @@ -28,7 +28,7 @@ UriPermissionManagerProxy::UriPermissionManagerProxy(const sptr & : IRemoteProxy(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 &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 &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); diff --git a/interfaces/inner_api/uri_permission/src/uri_permission_manager_stub.cpp b/interfaces/inner_api/uri_permission/src/uri_permission_manager_stub.cpp index b6dc6fcb2d..53daf6b7f3 100644 --- a/interfaces/inner_api/uri_permission/src/uri_permission_manager_stub.cpp +++ b/interfaces/inner_api/uri_permission/src/uri_permission_manager_stub.cpp @@ -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; } diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index e6d262f998..8f9f61baba 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -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 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 &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; } diff --git a/services/uripermmgr/include/uri_permission_manager_stub_impl.h b/services/uripermmgr/include/uri_permission_manager_stub_impl.h index 1dc6fdb614..c2cbc08e0c 100644 --- a/services/uripermmgr/include/uri_permission_manager_stub_impl.h +++ b/services/uripermmgr/include/uri_permission_manager_stub_impl.h @@ -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 &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 &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 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 &uriVec, unsigned int flag, uint32_t targetTokenId, @@ -89,10 +89,10 @@ private: std::unordered_map> &fromTokenIdVecMap); int GrantBatchUriPermissionImpl(const std::vector &uriVec, unsigned int flag, - std::vector &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 &uriVec, unsigned int flag, const std::string targetBundleName, int32_t appIndex); + int GrantUriPermissionInner(const std::vector &uriVec, unsigned int flag, const std::string targetBundleName, + int32_t appIndex, uint32_t initiatorTokenId); - int CheckGrantUriPermissionFor2In1( - const std::vector &uriVec, unsigned int flag, const std::string &targetBundleName, int32_t appIndex); + int CheckGrantUriPermissionFor2In1(const std::vector &uriVec, unsigned int flag, + const std::string &targetBundleName, int32_t appIndex, uint32_t initiatorTokenId); int GrantUriPermissionFor2In1Inner(const std::vector &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 &docsVec, bool isSystemAppCall); diff --git a/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp b/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp index 3f119ff745..6da19838f2 100644 --- a/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp +++ b/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp @@ -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 uriVec = { uri }; - return GrantUriPermission(uriVec, flag, targetBundleName, appIndex); + return GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId); } int UriPermissionManagerStubImpl::GrantUriPermission(const std::vector &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 &uriVec, unsigned int flag, const std::string targetBundleName, int32_t appIndex) +int UriPermissionManagerStubImpl::GrantUriPermissionInner(const std::vector &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 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 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 &uriVec, @@ -435,7 +438,7 @@ void UriPermissionManagerStubImpl::GetUriPermissionBatchFlag(const std::vector &uriVec, - unsigned int flag, std::vector &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> uriLists; { std::lock_guard 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 uriList; - std::lock_guard guard(mutex_); + std::lock_guard 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 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 &uriVec, unsigned int flag, const std::string &targetBundleName, int32_t appIndex) +int UriPermissionManagerStubImpl::CheckGrantUriPermissionFor2In1(const std::vector &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 &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; }