mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-24 12:43:16 -04:00
fixed
Signed-off-by: yuwenze <yuwenze1@huawei.com> Change-Id: If8099cd38eb86cf0e2bb42d9d7ddbb3675c24fe2
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user