diff --git a/frameworks/native/distributed_file_inner/include/distributed_file_daemon_proxy.h b/frameworks/native/distributed_file_inner/include/distributed_file_daemon_proxy.h index 8dbe49c759c20c4bd2074e733aa625b9bd6a0aa6..1ae611654cd5ff2b1cf837cfdbc20523ed22862f 100644 --- a/frameworks/native/distributed_file_inner/include/distributed_file_daemon_proxy.h +++ b/frameworks/native/distributed_file_inner/include/distributed_file_daemon_proxy.h @@ -48,11 +48,24 @@ public: HmdfsInfo &info) override; int32_t CancelCopyTask(const std::string &sessionName) override; int32_t CancelCopyTask(const std::string &srcUri, const std::string &dstUri) override; + int32_t RequestSendFile(const std::string &srcUri, const std::string &dstPath, const std::string &dstDeviceId, const std::string &sessionName) override; + // for ACL verification after 6.0 version + int32_t RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &dstDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) override; + int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) override; + // for ACL verification after 6.0 version + int32_t GetRemoteCopyInfoACL(const std::string &srcUri, + bool &isFile, + bool &isDir, + const AccountInfo &callerAccountInfo) override; int32_t PushAsset(int32_t userId, const sptr &assetObj, diff --git a/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp b/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp index c8be941489ab06a292a65afd52b32791d51ac624..cf8950c45b30742162b8a008fb854ed36ba17bf6 100644 --- a/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp +++ b/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp @@ -390,6 +390,62 @@ int32_t DistributedFileDaemonProxy::RequestSendFile(const std::string &srcUri, return reply.ReadInt32(); } +int32_t DistributedFileDaemonProxy::RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + LOGE("Failed to write interface token"); + return OHOS::FileManagement::E_BROKEN_IPC; + } + if (!data.WriteString(srcUri)) { + LOGE("Failed to send srcUri"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(dstPath)) { + LOGE("Failed to send dstPath"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(remoteDeviceId)) { + LOGE("Failed to send remoteDeviceId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(sessionName)) { + LOGE("Failed to send sessionName"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteInt32(callerAccountInfo.userId_)) { + LOGE("Failed to send userId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(callerAccountInfo.accountId_)) { + LOGE("Failed to send accountId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(callerAccountInfo.networkId_)) { + LOGE("Failed to send networkId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + auto remote = Remote(); + if (remote == nullptr) { + LOGE("remote is nullptr"); + return OHOS::FileManagement::E_BROKEN_IPC; + } + int32_t ret = remote->SendRequest( + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE_BASE_ACL), data, + reply, option); + if (ret != 0) { + LOGE("SendRequest failed, ret = %{public}d", ret); + return OHOS::FileManagement::E_BROKEN_IPC; + } + return reply.ReadInt32(); +} + int32_t DistributedFileDaemonProxy::GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) { MessageParcel data; @@ -430,6 +486,61 @@ int32_t DistributedFileDaemonProxy::GetRemoteCopyInfo(const std::string &srcUri, return ret; } +int32_t DistributedFileDaemonProxy::GetRemoteCopyInfoACL(const std::string &srcUri, + bool &isFile, + bool &isDir, + const AccountInfo &callerAccountInfo) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + LOGE("Failed to write interface token"); + return OHOS::FileManagement::E_BROKEN_IPC; + } + if (!data.WriteString(srcUri)) { + LOGE("Failed to send srcUri"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteInt32(callerAccountInfo.userId_)) { + LOGE("Failed to send userId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(callerAccountInfo.accountId_)) { + LOGE("Failed to send accountId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!data.WriteString(callerAccountInfo.networkId_)) { + LOGE("Failed to send networkId"); + return OHOS::FileManagement::E_INVAL_ARG; + } + auto remote = Remote(); + if (remote == nullptr) { + LOGE("remote is nullptr"); + return OHOS::FileManagement::E_BROKEN_IPC; + } + auto ret = remote->SendRequest( + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO_BASE_ACL), data, + reply, option); + if (ret != 0) { + LOGE("SendRequest failed, ret = %{public}d", ret); + return OHOS::FileManagement::E_BROKEN_IPC; + } + if (!reply.ReadBool(isFile)) { + LOGE("read isFile failed"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!reply.ReadBool(isDir)) { + LOGE("read isDir failed"); + return OHOS::FileManagement::E_INVAL_ARG; + } + if (!reply.ReadInt32(ret)) { + LOGE("read res failed"); + return OHOS::FileManagement::E_INVAL_ARG; + } + return ret; +} + int32_t DistributedFileDaemonProxy::CancelCopyTask(const std::string &sessionName) { MessageParcel data; diff --git a/services/distributedfiledaemon/BUILD.gn b/services/distributedfiledaemon/BUILD.gn index c0cd8cdbb6026e648abc273898081978a26f3c0e..4f6f4b10c8595bd8ee738790b25401d30de89a04 100644 --- a/services/distributedfiledaemon/BUILD.gn +++ b/services/distributedfiledaemon/BUILD.gn @@ -210,6 +210,7 @@ ohos_shared_library("distributed_file_daemon_kit_inner") { "app_file_service:remote_file_share_native", "c_utils:utils", "data_share:datashare_consumer", + "dsoftbus:softbus_client", "hilog:libhilog", "ipc:ipc_single", "safwk:system_ability_fwk", diff --git a/services/distributedfiledaemon/include/device/device_profile_adapter.h b/services/distributedfiledaemon/include/device/device_profile_adapter.h index 7bae78d33e055e21142e4114ebcbd04fe8bbd32f..20c2daf807c3e7cd77e459ff0e6d08e1e356535b 100644 --- a/services/distributedfiledaemon/include/device/device_profile_adapter.h +++ b/services/distributedfiledaemon/include/device/device_profile_adapter.h @@ -39,7 +39,7 @@ struct DfsVersion { return ss.str(); } }; - + class DeviceProfileAdapter { public: ~DeviceProfileAdapter() = default; @@ -48,9 +48,9 @@ public: static DeviceProfileAdapter instance; return instance; } - bool IsRemoteDfsVersionLower(const std::string &remoteNetworkId, + bool IsRemoteDfsVersionLowerThanLocal(const std::string &remoteNetworkId, VersionPackageName packageName = VersionPackageName::DFS_VERSION); - bool IsRemoteDfsVersionLower(const std::string &remoteNetworkId, + bool IsRemoteDfsVersionLowerThanGiven(const std::string &remoteNetworkId, const DfsVersion& thresholdDfsVersion, VersionPackageName packageName = VersionPackageName::DFS_VERSION); int32_t GetDfsVersionFromNetworkId(const std::string &networkId, DfsVersion &dfsVersion, VersionPackageName packageName = VersionPackageName::DFS_VERSION); diff --git a/services/distributedfiledaemon/include/ipc/daemon.h b/services/distributedfiledaemon/include/ipc/daemon.h index e21c348e07b6d93ce33f7fad8f6667bcba0eb32d..0444a718fa0f3de79b5b88d04096c912feca422f 100644 --- a/services/distributedfiledaemon/include/ipc/daemon.h +++ b/services/distributedfiledaemon/include/ipc/daemon.h @@ -25,6 +25,7 @@ #include "daemon_eventhandler.h" #include "daemon_execute.h" #include "daemon_stub.h" +#include "device/device_profile_adapter.h" #include "dm_device_info.h" #include "file_trans_listener_proxy.h" #include "hmdfs_info.h" @@ -80,7 +81,16 @@ public: const std::string &dstPath, const std::string &dstDeviceId, const std::string &sessionName) override; + // for ACL verification after 6.0 version + int32_t RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &dstDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) override; int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) override; + // for ACL verification after 6.0 version + int32_t GetRemoteCopyInfoACL(const std::string &srcUri, bool &isFile, bool &isDir, + const AccountInfo &callerAccountInfo) override; int32_t PushAsset(int32_t userId, const sptr &assetObj, @@ -95,7 +105,8 @@ public: static int32_t Copy(const std::string &srcUri, const std::string &dstPath, const sptr &daemon, - const std::string &sessionName); + const std::string &sessionName, + const std::string &srcNetworkId); int32_t GetDfsSwitchStatus(const std::string &networkId, int32_t &switchStatus) override; int32_t UpdateDfsSwitchStatus(int32_t switchStatus) override; int32_t GetConnectedDeviceList(std::vector &deviceList) override; @@ -118,12 +129,17 @@ private: const std::string &dstUri, std::string &physicalPath, HmdfsInfo &info, - const sptr &daemon); + const sptr &daemon, + const std::string &networkId); int32_t CheckCopyRule(std::string &physicalPath, const std::string &dstUri, HapTokenInfo &hapTokenInfo, const bool &isSrcFile, HmdfsInfo &info); + int32_t HandleDestinationPathAndPermissions(const std::string &dstUri, + bool isSrcFile, + HmdfsInfo &info, + std::string &physicalPath); int32_t SendDfsDelayTask(const std::string &networkId); void RemoveDfsDelayTask(const std::string &networkId); void DisconnectDevice(const std::string networkId); diff --git a/services/distributedfiledaemon/include/ipc/daemon_event.h b/services/distributedfiledaemon/include/ipc/daemon_event.h index ee0abfdba0fe9991a9cf43a3f5abe383211ec7eb..a89669bdb63781f3ff60a0e0b284e5a7dfeeb261 100644 --- a/services/distributedfiledaemon/include/ipc/daemon_event.h +++ b/services/distributedfiledaemon/include/ipc/daemon_event.h @@ -67,13 +67,15 @@ struct PrepareSessionData { const std::string &sessionName, const sptr daemon, HmdfsInfo &info, - const std::shared_ptr> &prepareSessionBlock) + const std::shared_ptr> &prepareSessionBlock, + const std::string &srcNetworkId) : srcUri_(srcUri), physicalPath_(physicalPath), sessionName_(sessionName), daemon_(daemon), info_(info), - prepareSessionBlock_(prepareSessionBlock) + prepareSessionBlock_(prepareSessionBlock), + srcNetworkId_(srcNetworkId) { } @@ -83,6 +85,7 @@ struct PrepareSessionData { const sptr daemon_; HmdfsInfo &info_; const std::shared_ptr> prepareSessionBlock_; + const std::string srcNetworkId_; }; } // namespace DistributedFile diff --git a/services/distributedfiledaemon/include/ipc/daemon_execute.h b/services/distributedfiledaemon/include/ipc/daemon_execute.h index d96528d3308ed2f920745ceeecaefd9b51403f99..04e2bd14638a49fe6932d47dc032fad1e13817d0 100644 --- a/services/distributedfiledaemon/include/ipc/daemon_execute.h +++ b/services/distributedfiledaemon/include/ipc/daemon_execute.h @@ -47,7 +47,8 @@ private: std::string &physicalPath, const std::string &sessionName, const sptr &daemon, - HmdfsInfo &info); + HmdfsInfo &info, + const std::string &srcNetworkId); private: std::string GetZipName(const std::string &relativePath); std::vector GetFileList(const std::vector &uris, diff --git a/services/distributedfiledaemon/include/ipc/daemon_stub.h b/services/distributedfiledaemon/include/ipc/daemon_stub.h index 22e1ffae585fafca12141abb98fc5a46d690ac58..31eb210901c882272231b9c1e6fdf565e309b04d 100644 --- a/services/distributedfiledaemon/include/ipc/daemon_stub.h +++ b/services/distributedfiledaemon/include/ipc/daemon_stub.h @@ -45,7 +45,9 @@ private: int32_t HandleCancelCopyTask(MessageParcel &data, MessageParcel &reply); int32_t HandleInnerCancelCopyTask(MessageParcel &data, MessageParcel &reply); int32_t HandleRequestSendFile(MessageParcel &data, MessageParcel &reply); + int32_t HandleRequestSendFileACL(MessageParcel &data, MessageParcel &reply); int32_t HandleGetRemoteCopyInfo(MessageParcel &data, MessageParcel &reply); + int32_t HandleGetRemoteCopyInfoACL(MessageParcel &data, MessageParcel &reply); int32_t HandlePushAsset(MessageParcel &data, MessageParcel &reply); int32_t HandleRegisterRecvCallback(MessageParcel &data, MessageParcel &reply); diff --git a/services/distributedfiledaemon/include/ipc/distributed_file_daemon_ipc_interface_code.h b/services/distributedfiledaemon/include/ipc/distributed_file_daemon_ipc_interface_code.h index 7ecd93d32645c7427a3c8e6704fcdfa2cbc80451..1efa946b80ec549c1157f560a18d595be6f09eb1 100644 --- a/services/distributedfiledaemon/include/ipc/distributed_file_daemon_ipc_interface_code.h +++ b/services/distributedfiledaemon/include/ipc/distributed_file_daemon_ipc_interface_code.h @@ -33,9 +33,11 @@ namespace DistributedFile { DISTRIBUTED_FILE_UN_REGISTER_ASSET_CALLBACK, DISTRIBUTED_FILE_PUSH_ASSET, GET_DFS_URI_IS_DIR_FROM_LOCAL, + DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO_BASE_ACL, + DISTRIBUTED_FILE_REQUEST_SEND_FILE_BASE_ACL, DISTRIBUTED_FILE_GET_DFS_SWITCH_STATUS, DISTRIBUTED_FILE_UPDATE_DFS_SWITCH_STATUS, - DISTRIBUTED_FILE_GET_CONNECTED_DEVICE_LIST + DISTRIBUTED_FILE_GET_CONNECTED_DEVICE_LIST, }; } // namespace DistributedFile } // namespace Storage diff --git a/services/distributedfiledaemon/include/ipc/i_daemon.h b/services/distributedfiledaemon/include/ipc/i_daemon.h index 67ef3ad08d8f7e8a5f89a58e5b52296f5d4bb5bd..508281dca21a94ad51dcb6397952006afc5efaef 100644 --- a/services/distributedfiledaemon/include/ipc/i_daemon.h +++ b/services/distributedfiledaemon/include/ipc/i_daemon.h @@ -24,6 +24,7 @@ #include "hmdfs_info.h" #include "iremote_broker.h" #include "i_file_dfs_listener.h" +#include "network/softbus/softbus_permission_check.h" #include "remote_file_share.h" namespace OHOS { @@ -50,8 +51,17 @@ public: const std::string &dstPath, const std::string &remoteDeviceId, const std::string &sessionName) = 0; - static inline const std::string SERVICE_NAME { "ohos.storage.distributedfile.daemon" }; + virtual int32_t RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) = 0; + static inline const std::string SERVICE_NAME{"ohos.storage.distributedfile.daemon"}; virtual int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) = 0; + virtual int32_t GetRemoteCopyInfoACL(const std::string &srcUri, + bool &isFile, + bool &isDir, + const AccountInfo &callerAccountInfo) = 0; virtual int32_t PushAsset(int32_t userId, const sptr &assetObj, diff --git a/services/distributedfiledaemon/src/device/device_profile_adapter.cpp b/services/distributedfiledaemon/src/device/device_profile_adapter.cpp index 648c4ec2896919b2da992108f2b44d8682482c6d..1566a0ce69d9d7941988432934aaea9f96aa9ed7 100644 --- a/services/distributedfiledaemon/src/device/device_profile_adapter.cpp +++ b/services/distributedfiledaemon/src/device/device_profile_adapter.cpp @@ -64,29 +64,31 @@ static inline bool Str2Bool(const std::string &value) } #endif -bool DeviceProfileAdapter::IsRemoteDfsVersionLower(const std::string &remoteNetworkId, - VersionPackageName packageName) +bool DeviceProfileAdapter::IsRemoteDfsVersionLowerThanLocal(const std::string &remoteNetworkId, + VersionPackageName packageName) { + LOGI("remoteDevice.networkId: %{public}.6s", remoteNetworkId.c_str()); #ifdef SUPPORT_DEVICE_PROFILE - LOGI("remoteDevice.networkId: %{public}.5s", remoteNetworkId.c_str()); DfsVersion localDfsVersion; int32_t ret = GetLocalDfsVersion(packageName, localDfsVersion); if (ret != FileManagement::ERR_OK) { LOGE("GetLocalDfsVersion failed, ret=%{public}d", ret); return false; } - return IsRemoteDfsVersionLower(remoteNetworkId, localDfsVersion, packageName); + return IsRemoteDfsVersionLowerThanGiven(remoteNetworkId, localDfsVersion, packageName); #else return false; #endif } // Comparison of version numbers later than the current version number is not supported. -bool DeviceProfileAdapter::IsRemoteDfsVersionLower(const std::string &remoteNetworkId, - const DfsVersion &thresholdDfsVersion, VersionPackageName packageName) +bool DeviceProfileAdapter::IsRemoteDfsVersionLowerThanGiven(const std::string &remoteNetworkId, + const DfsVersion &givenDfsVersion, + VersionPackageName packageName) { + LOGI("remoteDevice.networkId: %{public}.6s, GivenDFSVersion: %{public}s", remoteNetworkId.c_str(), + givenDfsVersion.dump().c_str()); #ifdef SUPPORT_DEVICE_PROFILE - LOGI("remoteDevice.networkId: %{public}.5s", remoteNetworkId.c_str()); if (remoteNetworkId.empty()) { LOGE("remoteNetworkId is empty"); return false; @@ -97,7 +99,7 @@ bool DeviceProfileAdapter::IsRemoteDfsVersionLower(const std::string &remoteNetw LOGE("GetDfsVersionFromNetworkId failed, ret=%{public}d", ret); return false; } - return CompareDfsVersion(remoteDfsVersion, thresholdDfsVersion); + return CompareDfsVersion(remoteDfsVersion, givenDfsVersion); #else return false; #endif diff --git a/services/distributedfiledaemon/src/ipc/daemon.cpp b/services/distributedfiledaemon/src/ipc/daemon.cpp index 333ee17fcbb761405fc84a09c3bb1742a573bacd..6090134ff3c1e490ed0cd010e0a807a74f27844e 100644 --- a/services/distributedfiledaemon/src/ipc/daemon.cpp +++ b/services/distributedfiledaemon/src/ipc/daemon.cpp @@ -83,6 +83,7 @@ constexpr mode_t DEFAULT_UMASK = 0002; constexpr int32_t BLOCK_INTERVAL_SEND_FILE = 10 * 1000; constexpr int32_t DEFAULT_USER_ID = 100; constexpr int32_t VALID_MOUNT_NETWORKID_LEN = 16; +constexpr DfsVersion ACL_VERSION = {6, 0, 1}; constexpr uint64_t INNER_COPY_LIMIT = 1024 * 1024 * 1024; } // namespace @@ -270,7 +271,9 @@ int32_t Daemon::CleanUp(const DistributedHardware::DmDeviceInfo &deviceInfo) } int32_t Daemon::ConnectionAndMount(const DistributedHardware::DmDeviceInfo &deviceInfo, - const std::string &networkId, uint32_t callingTokenId, sptr remoteReverseObj) + const std::string &networkId, + uint32_t callingTokenId, + sptr remoteReverseObj) { LOGI("ConnectionAndMount start"); int32_t ret = NO_ERROR; @@ -352,7 +355,7 @@ int32_t Daemon::CloseP2PConnectionEx(const std::string &networkId) auto deviceManager = DeviceManagerAgent::GetInstance(); auto callingTokenId = IPCSkeleton::GetCallingTokenID(); if (networkId.empty() || networkId.length() >= DM_MAX_DEVICE_ID_LEN) { - LOGE("Daemon::CloseP2PConnectionEx networkId length is invalid. len: %{public}zu", networkId.length()); + LOGE("Daemon::CloseP2PConnectionEx networkId length is invalid. len: %{public}zu", networkId.length()); return E_INVAL_ARG_NAPI; } std::string deviceId = deviceManager->GetDeviceIdByNetworkId(networkId); @@ -418,8 +421,8 @@ int32_t Daemon::RequestSendFile(const std::string &srcUri, return OHOS::FileManagement::E_ILLEGAL_URI; } auto requestSendFileBlock = std::make_shared>(BLOCK_INTERVAL_SEND_FILE, ERR_BAD_VALUE); - auto requestSendFileData = std::make_shared( - srcUri, dstPath, dstDeviceId, sessionName, requestSendFileBlock); + auto requestSendFileData = + std::make_shared(srcUri, dstPath, dstDeviceId, sessionName, requestSendFileBlock); auto msgEvent = AppExecFwk::InnerEvent::Get(DEAMON_EXECUTE_REQUEST_SEND_FILE, requestSendFileData, 0); { std::lock_guard lock(eventHandlerMutex_); @@ -439,8 +442,25 @@ int32_t Daemon::RequestSendFile(const std::string &srcUri, return ret; } -int32_t Daemon::InnerCopy(const std::string &srcUri, const std::string &dstUri, - const std::string &srcDeviceId, const sptr &listener, HmdfsInfo &info) +int32_t Daemon::RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &dstDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) +{ + LOGI("RequestSendFileACL begin dstDeviceId: %{public}s", Utils::GetAnonyString(dstDeviceId).c_str()); + if (!SoftBusPermissionCheck::CheckSinkPermission(callerAccountInfo)) { + LOGE("CheckSinkPermission failed"); + return ERR_ACL_FAILED; + } + return RequestSendFile(srcUri, dstPath, dstDeviceId, sessionName); +} + +int32_t Daemon::InnerCopy(const std::string &srcUri, + const std::string &dstUri, + const std::string &srcDeviceId, + const sptr &listener, + HmdfsInfo &info) { if (!FileSizeUtils::IsFilePathValid(FileSizeUtils::GetRealUri(srcUri)) || !FileSizeUtils::IsFilePathValid(FileSizeUtils::GetRealUri(dstUri))) { @@ -454,8 +474,8 @@ int32_t Daemon::InnerCopy(const std::string &srcUri, const std::string &dstUri, return ERR_BAD_VALUE; } OpenP2PConnection(deviceInfo); - auto ret = Storage::DistributedFile::RemoteFileCopyManager::GetInstance()->RemoteCopy(srcUri, dstUri, - listener, QueryActiveUserId(), info.copyPath); + auto ret = Storage::DistributedFile::RemoteFileCopyManager::GetInstance()->RemoteCopy( + srcUri, dstUri, listener, QueryActiveUserId(), info.copyPath); CloseP2PConnection(deviceInfo); LOGI("InnerCopy end, ret = %{public}d", ret); return ret; @@ -463,7 +483,7 @@ int32_t Daemon::InnerCopy(const std::string &srcUri, const std::string &dstUri, int32_t Daemon::PrepareSession(const std::string &srcUri, const std::string &dstUri, - const std::string &srcDeviceId, + const std::string &srcNetworkId, const sptr &listener, HmdfsInfo &info) { @@ -488,30 +508,30 @@ int32_t Daemon::PrepareSession(const std::string &srcUri, } DfsVersion remoteDfsVersion; - auto ret = DeviceProfileAdapter::GetInstance().GetDfsVersionFromNetworkId(srcDeviceId, remoteDfsVersion); + int32_t ret = DeviceProfileAdapter::GetInstance().GetDfsVersionFromNetworkId(srcNetworkId, remoteDfsVersion); LOGI("GetRemoteVersion: ret:%{public}d, version:%{public}s", ret, remoteDfsVersion.dump().c_str()); if ((ret == FileManagement::ERR_OK) && (remoteDfsVersion.majorVersionNum != 0) && fileSize < INNER_COPY_LIMIT) { - return InnerCopy(srcUri, dstUri, srcDeviceId, listenerCallback, info); + return InnerCopy(srcUri, dstUri, srcNetworkId, listenerCallback, info); } - return CopyBaseOnRPC(srcUri, dstUri, srcDeviceId, listenerCallback, info); + return CopyBaseOnRPC(srcUri, dstUri, srcNetworkId, listenerCallback, info); } int32_t Daemon::CopyBaseOnRPC(const std::string &srcUri, const std::string &dstUri, - const std::string &srcDeviceId, + const std::string &srcNetworkId, const sptr &listenerCallback, HmdfsInfo &info) { - auto daemon = GetRemoteSA(srcDeviceId); + auto daemon = GetRemoteSA(srcNetworkId); if (daemon == nullptr) { - LOGE("Daemon is nullptr"); + LOGE("GetRemoteSA is nullptr"); return E_SA_LOAD_FAILED; } std::string physicalPath; - auto ret = GetRealPath(srcUri, dstUri, physicalPath, info, daemon); + auto ret = GetRealPath(srcUri, dstUri, physicalPath, info, daemon, srcNetworkId); if (ret != E_OK) { LOGE("GetRealPath failed, ret = %{public}d", ret); return ret; @@ -522,8 +542,8 @@ int32_t Daemon::CopyBaseOnRPC(const std::string &srcUri, } auto prepareSessionBlock = std::make_shared>(BLOCK_INTERVAL_SEND_FILE, ERR_BAD_VALUE); - auto prepareSessionData = - std::make_shared(srcUri, physicalPath, info.sessionName, daemon, info, prepareSessionBlock); + auto prepareSessionData = std::make_shared(srcUri, physicalPath, info.sessionName, daemon, info, + prepareSessionBlock, srcNetworkId); auto msgEvent = AppExecFwk::InnerEvent::Get(DEAMON_EXECUTE_PREPARE_SESSION, prepareSessionData, 0); { std::lock_guard lock(eventHandlerMutex_); @@ -564,7 +584,8 @@ int32_t Daemon::GetRealPath(const std::string &srcUri, const std::string &dstUri, std::string &physicalPath, HmdfsInfo &info, - const sptr &daemon) + const sptr &daemon, + const std::string &srcNetworkId) { bool isSrcFile = false; bool isSrcDir = false; @@ -577,26 +598,53 @@ int32_t Daemon::GetRealPath(const std::string &srcUri, LOGE("Path is forbidden"); return OHOS::FileManagement::E_ILLEGAL_URI; } - auto ret = daemon->GetRemoteCopyInfo(srcUri, isSrcFile, isSrcDir); + + int32_t ret = E_OK; + if (!DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanGiven(srcNetworkId, ACL_VERSION)) { + LOGI("Version >= 6.0.1, need ACL check"); + if (!SoftBusPermissionCheck::CheckSrcPermission(srcNetworkId)) { + LOGE("CheckSrcPermission failed"); + return ERR_ACL_FAILED; + } + + AccountInfo localAccountInfo; + if (!SoftBusPermissionCheck::GetLocalAccountInfo(localAccountInfo)) { + LOGE("GetLocalAccountInfo failed"); + return ERR_ACL_FAILED; + } + ret = daemon->GetRemoteCopyInfoACL(srcUri, isSrcFile, isSrcDir, localAccountInfo); + } else { + ret = daemon->GetRemoteCopyInfo(srcUri, isSrcFile, isSrcDir); + } + if (ret != E_OK) { LOGE("GetRemoteCopyInfo failed, ret = %{public}d", ret); RADAR_REPORT(RadarReporter::DFX_SET_DFS, RadarReporter::DFX_SET_BIZ_SCENE, RadarReporter::DFX_FAILED, - RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, - RadarReporter::GET_REMOTE_COPY_INFO_ERROR); + RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, + RadarReporter::GET_REMOTE_COPY_INFO_ERROR); return E_SOFTBUS_SESSION_FAILED; } + return HandleDestinationPathAndPermissions(dstUri, isSrcFile, info, physicalPath); +} + +int32_t Daemon::HandleDestinationPathAndPermissions(const std::string &dstUri, + bool isSrcFile, + HmdfsInfo &info, + std::string &physicalPath) +{ HapTokenInfo hapTokenInfo; int result = AccessTokenKit::GetHapTokenInfo(IPCSkeleton::GetCallingTokenID(), hapTokenInfo); if (result != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) { LOGE("GetHapTokenInfo failed, errCode = %{public}d", result); RADAR_REPORT(RadarReporter::DFX_SET_DFS, RadarReporter::DFX_SET_BIZ_SCENE, RadarReporter::DFX_FAILED, - RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, - RadarReporter::GET_HAP_TOKEN_INFO_ERROR, RadarReporter::PACKAGE_NAME, - RadarReporter::accessTokenKit + to_string(result)); + RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, + RadarReporter::GET_HAP_TOKEN_INFO_ERROR, RadarReporter::PACKAGE_NAME, + RadarReporter::accessTokenKit + std::to_string(result)); return E_GET_USER_ID; } - ret = SandboxHelper::GetPhysicalPath(dstUri, std::to_string(hapTokenInfo.userID), physicalPath); + + int32_t ret = SandboxHelper::GetPhysicalPath(dstUri, std::to_string(hapTokenInfo.userID), physicalPath); if (ret != E_OK) { LOGE("invalid uri, ret = %{public}d", ret); return E_GET_PHYSICAL_PATH_FAILED; @@ -604,11 +652,13 @@ int32_t Daemon::GetRealPath(const std::string &srcUri, LOGI("GetRealPath userId %{public}s", std::to_string(hapTokenInfo.userID).c_str()); info.dstPhysicalPath = physicalPath; + ret = CheckCopyRule(physicalPath, dstUri, hapTokenInfo, isSrcFile, info); if (ret != E_OK) { LOGE("CheckCopyRule failed, ret = %{public}d", ret); return E_GET_PHYSICAL_PATH_FAILED; } + return E_OK; } @@ -687,6 +737,19 @@ int32_t Daemon::GetRemoteCopyInfo(const std::string &srcUri, bool &isSrcFile, bo return E_OK; } +int32_t Daemon::GetRemoteCopyInfoACL(const std::string &srcUri, + bool &isSrcFile, + bool &srcIsDir, + const AccountInfo &callerAccountInfo) +{ + LOGI("GetRemoteCopyInfoACL begin."); + if (!SoftBusPermissionCheck::CheckSinkPermission(callerAccountInfo)) { + LOGE("CheckSinkPermission failed"); + return ERR_ACL_FAILED; + } + return GetRemoteCopyInfo(srcUri, isSrcFile, srcIsDir); +} + sptr Daemon::GetRemoteSA(const std::string &remoteDeviceId) { LOGI("GetRemoteSA begin, DeviceId: %{public}s", Utils::GetAnonyString(remoteDeviceId).c_str()); @@ -700,8 +763,8 @@ sptr Daemon::GetRemoteSA(const std::string &remoteDeviceId) if (object == nullptr) { LOGE("GetSystemAbility failed"); RADAR_REPORT(RadarReporter::DFX_SET_DFS, RadarReporter::DFX_SET_BIZ_SCENE, RadarReporter::DFX_FAILED, - RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, - RadarReporter::GET_SYSTEM_ABILITY_ERROR, RadarReporter::PACKAGE_NAME, RadarReporter::saMgr); + RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, + RadarReporter::GET_SYSTEM_ABILITY_ERROR, RadarReporter::PACKAGE_NAME, RadarReporter::saMgr); return nullptr; } auto daemon = iface_cast(object); @@ -716,8 +779,13 @@ sptr Daemon::GetRemoteSA(const std::string &remoteDeviceId) int32_t Daemon::Copy(const std::string &srcUri, const std::string &dstPath, const sptr &daemon, - const std::string &sessionName) + const std::string &sessionName, + const std::string &srcNetworkId) { + if (daemon == nullptr) { + LOGE("Daemon::Copy daemon is nullptr"); + return E_INVAL_ARG_NAPI; + } if (!FileSizeUtils::IsFilePathValid(FileSizeUtils::GetRealUri(srcUri)) || !FileSizeUtils::IsFilePathValid(FileSizeUtils::GetRealUri(dstPath))) { LOGE("Path is forbidden"); @@ -730,17 +798,32 @@ int32_t Daemon::Copy(const std::string &srcUri, LOGE("GetLocalDeviceInfo failed, errCode = %{public}d", errCode); return E_GET_DEVICE_ID; } - if (daemon == nullptr) { - LOGE("Daemon::Copy daemon is nullptr"); - return E_INVAL_ARG_NAPI; - } LOGI("Copy localDeviceInfo.networkId: %{public}s", Utils::GetAnonyString(localDeviceInfo.networkId).c_str()); - auto ret = daemon->RequestSendFile(srcUri, dstPath, localDeviceInfo.networkId, sessionName); + + int32_t ret = E_OK; + if (!DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanGiven(srcNetworkId, ACL_VERSION)) { + LOGI("Version >= 6.0.1, need ACL check"); + if (!SoftBusPermissionCheck::CheckSrcPermission(srcNetworkId)) { + LOGE("CheckSrcPermission failed"); + return ERR_ACL_FAILED; + } + + AccountInfo localAccountInfo; + if (!SoftBusPermissionCheck::GetLocalAccountInfo(localAccountInfo)) { + LOGE("GetLocalAccountInfo failed"); + return ERR_ACL_FAILED; + } + + ret = daemon->RequestSendFileACL(srcUri, dstPath, localDeviceInfo.networkId, sessionName, localAccountInfo); + } else { + ret = daemon->RequestSendFile(srcUri, dstPath, localDeviceInfo.networkId, sessionName); + } + if (ret != E_OK) { LOGE("RequestSendFile failed, ret = %{public}d", ret); RADAR_REPORT(RadarReporter::DFX_SET_DFS, RadarReporter::DFX_SET_BIZ_SCENE, RadarReporter::DFX_FAILED, - RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, - RadarReporter::REQUEST_SEND_FILE_ERROR, RadarReporter::PACKAGE_NAME, ret); + RadarReporter::BIZ_STATE, RadarReporter::DFX_END, RadarReporter::ERROR_CODE, + RadarReporter::REQUEST_SEND_FILE_ERROR, RadarReporter::PACKAGE_NAME, ret); return E_SA_LOAD_FAILED; } return E_OK; @@ -822,9 +905,7 @@ void Daemon::DfsListenerDeathRecipient::OnRemoteDied(const wptr & return; } -int32_t Daemon::PushAsset(int32_t userId, - const sptr &assetObj, - const sptr &sendCallback) +int32_t Daemon::PushAsset(int32_t userId, const sptr &assetObj, const sptr &sendCallback) { LOGI("Daemon::PushAsset begin."); if (assetObj == nullptr || sendCallback == nullptr) { @@ -913,7 +994,7 @@ int32_t Daemon::SendDfsDelayTask(const std::string &networkId) auto executeFunc = [this, networkId] { DisconnectDevice(networkId); }; bool isSucc = eventHandler_->PostTask(executeFunc, networkId, DEFAULT_DELAY_INTERVAL, - AppExecFwk::EventHandler::Priority::IMMEDIATE); + AppExecFwk::EventHandler::Priority::IMMEDIATE); if (!isSucc) { LOGE("Daemon event handler post delay disconnect device event fail."); return E_EVENT_HANDLER; @@ -947,10 +1028,10 @@ void Daemon::DisconnectDevice(const std::string networkId) LOGI("Daemon::DisconnectDevice result %{public}d", ret); } -int32_t Daemon::GetDfsUrisDirFromLocal(const std::vector &uriList, - const int32_t userId, - std::unordered_map &uriToDfsUriMaps) +int32_t Daemon::GetDfsUrisDirFromLocal( + const std::vector &uriList, + const int32_t userId, + std::unordered_map &uriToDfsUriMaps) { LOGI("Daemon::GetDfsUrisDirFromLocal start"); auto callingUid = IPCSkeleton::GetCallingUid(); diff --git a/services/distributedfiledaemon/src/ipc/daemon_execute.cpp b/services/distributedfiledaemon/src/ipc/daemon_execute.cpp index 7f9b6774b4f1d45611028dc9217d2e0e74c01d3f..83e16f443a8528957cd6e01ee5313ae111467ac0 100644 --- a/services/distributedfiledaemon/src/ipc/daemon_execute.cpp +++ b/services/distributedfiledaemon/src/ipc/daemon_execute.cpp @@ -211,25 +211,27 @@ void DaemonExecute::ExecutePrepareSession(const AppExecFwk::InnerEvent::Pointer return; } - auto prepareSessionBlock = prepareSessionData->prepareSessionBlock_; + auto prepareSessionBlock = prepareSessionData->prepareSessionBlock_; if (prepareSessionBlock == nullptr) { LOGE("prepareSessionBlock is nullptr."); return; } std::string srcUri = prepareSessionData->srcUri_; - std::string physicalPath = prepareSessionData->physicalPath_; - std::string sessionName = prepareSessionData->sessionName_; - sptr daemon = prepareSessionData->daemon_; + std::string physicalPath = prepareSessionData->physicalPath_; + std::string sessionName = prepareSessionData->sessionName_; + sptr daemon = prepareSessionData->daemon_; HmdfsInfo &info = prepareSessionData->info_; + std::string srcNetworkId = prepareSessionData->srcNetworkId_; - prepareSessionBlock->SetValue(PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info)); + prepareSessionBlock->SetValue(PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info, srcNetworkId)); } int32_t DaemonExecute::PrepareSessionInner(const std::string &srcUri, std::string &physicalPath, const std::string &sessionName, const sptr &daemon, - HmdfsInfo &info) + HmdfsInfo &info, + const std::string &srcNetworkId) { LOGI("PrepareSessionInner begin."); auto socketId = SoftBusHandler::GetInstance().CreateSessionServer(IDaemon::SERVICE_NAME, sessionName, @@ -243,7 +245,7 @@ int32_t DaemonExecute::PrepareSessionInner(const std::string &srcUri, LOGI("authority is media or docs"); physicalPath = "??" + info.dstPhysicalPath; } - auto ret = Daemon::Copy(srcUri, physicalPath, daemon, sessionName); + auto ret = Daemon::Copy(srcUri, physicalPath, daemon, sessionName, srcNetworkId); if (ret != E_OK) { LOGE("Remote copy failed,ret = %{public}d", ret); SoftBusHandler::GetInstance().CloseSession(socketId, sessionName); diff --git a/services/distributedfiledaemon/src/ipc/daemon_stub.cpp b/services/distributedfiledaemon/src/ipc/daemon_stub.cpp index acf73d0a595a1a468ad12acdc113aa5b53e9c6d8..e672cc58f70ad4bb616fcb898887cc20628f42be 100644 --- a/services/distributedfiledaemon/src/ipc/daemon_stub.cpp +++ b/services/distributedfiledaemon/src/ipc/daemon_stub.cpp @@ -21,8 +21,9 @@ #include "dm_device_info.h" #include "ipc/distributed_file_daemon_ipc_interface_code.h" #include "ipc_skeleton.h" -#include "utils_log.h" #include "securec.h" +#include "utils_log.h" +#include namespace OHOS { namespace Storage { @@ -65,6 +66,12 @@ DaemonStub::DaemonStub() &DaemonStub::HandlePushAsset; opToInterfaceMap_[static_cast(DistributedFileDaemonInterfaceCode::GET_DFS_URI_IS_DIR_FROM_LOCAL)] = &DaemonStub::HandleGetDfsUrisDirFromLocal; + opToInterfaceMap_[static_cast( + DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO_BASE_ACL)] = + &DaemonStub::HandleGetRemoteCopyInfoACL; + opToInterfaceMap_[static_cast( + DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE_BASE_ACL)] = + &DaemonStub::HandleRequestSendFileACL; opToInterfaceMap_[static_cast( DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_DFS_SWITCH_STATUS)] = &DaemonStub::HandleGetDfsSwitchStatus; @@ -81,10 +88,15 @@ int32_t DaemonStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageP if (data.ReadInterfaceToken() != GetDescriptor()) { return DFS_DAEMON_DESCRIPTOR_IS_EMPTY; } - if (code != static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE) && - code != static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO) && - !IPCSkeleton::IsLocalCalling()) { - LOGE("function is only allowed to be called locally."); + + static const std::unordered_set remoteAllowedCodes = { + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE), + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO), + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO_BASE_ACL), + static_cast(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE_BASE_ACL)}; + + if (remoteAllowedCodes.find(code) == remoteAllowedCodes.end() && !IPCSkeleton::IsLocalCalling()) { + LOGE("Function is only allowed to be called locally, code: %{public}u", code); return E_ALLOW_LOCAL_CALL_ONLY; } auto iter = opToInterfaceMap_.find(code); @@ -276,6 +288,51 @@ int32_t DaemonStub::HandleRequestSendFile(MessageParcel &data, MessageParcel &re return res; } +int32_t DaemonStub::HandleRequestSendFileACL(MessageParcel &data, MessageParcel &reply) +{ + LOGI("Begin HandleRequestSendFileACL"); + std::string srcUri; + if (!data.ReadString(srcUri)) { + LOGE("read srcUri failed"); + return E_IPC_READ_FAILED; + } + std::string dstPath; + if (!data.ReadString(dstPath)) { + LOGE("read dstPath failed"); + return E_IPC_READ_FAILED; + } + std::string dstDeviceId; + if (!data.ReadString(dstDeviceId)) { + LOGE("read remoteDeviceId failed"); + return E_IPC_READ_FAILED; + } + std::string sessionName; + if (!data.ReadString(sessionName)) { + LOGE("read sessionName failed"); + return E_IPC_READ_FAILED; + } + AccountInfo callerAccountInfo; + if (!data.ReadInt32(callerAccountInfo.userId_)) { + LOGE("read userId failed"); + return E_IPC_READ_FAILED; + } + if (!data.ReadString(callerAccountInfo.accountId_)) { + LOGE("read accountId failed"); + return E_IPC_READ_FAILED; + } + if (!data.ReadString(callerAccountInfo.networkId_)) { + LOGE("read networkId failed"); + return E_IPC_READ_FAILED; + } + auto res = RequestSendFileACL(srcUri, dstPath, dstDeviceId, sessionName, callerAccountInfo); + if (!reply.WriteInt32(res)) { + LOGE("read networkId failed"); + return E_IPC_READ_FAILED; + } + LOGD("End HandleRequestSendFileACL, ret = %{public}d.", res); + return res; +} + int32_t DaemonStub::HandleGetRemoteCopyInfo(MessageParcel &data, MessageParcel &reply) { LOGI("Begin HandleGetRemoteCopyInfo"); @@ -307,6 +364,46 @@ int32_t DaemonStub::HandleGetRemoteCopyInfo(MessageParcel &data, MessageParcel & return res; } +int32_t DaemonStub::HandleGetRemoteCopyInfoACL(MessageParcel &data, MessageParcel &reply) +{ + LOGI("Begin HandleGetRemoteCopyInfoACL"); + std::string srcUri; + AccountInfo callerAccountInfo; + if (!data.ReadString(srcUri)) { + LOGE("read srcUri failed"); + return E_IPC_READ_FAILED; + } + if (!data.ReadInt32(callerAccountInfo.userId_)) { + LOGE("read userId failed"); + return E_IPC_READ_FAILED; + } + if (!data.ReadString(callerAccountInfo.accountId_)) { + LOGE("read accountId failed"); + return E_IPC_READ_FAILED; + } + if (!data.ReadString(callerAccountInfo.networkId_)) { + LOGE("read networkId failed"); + return E_IPC_READ_FAILED; + } + bool isFile = false; + bool isDir = false; + auto res = GetRemoteCopyInfoACL(srcUri, isFile, isDir, callerAccountInfo); + if (!reply.WriteBool(isFile)) { + LOGE("Write isFile failed"); + return E_IPC_WRITE_FAILED; + } + if (!reply.WriteBool(isDir)) { + LOGE("Write isDir failed"); + return E_IPC_WRITE_FAILED; + } + if (!reply.WriteInt32(res)) { + LOGE("Write res failed"); + return E_IPC_WRITE_FAILED; + } + LOGD("End GetRemoteCopyInfoACL, ret = %{public}d.", res); + return res; +} + int32_t DaemonStub::HandleCancelCopyTask(MessageParcel &data, MessageParcel &reply) { LOGI("Begin HandleCancelCopyTask"); @@ -555,6 +652,6 @@ int32_t DaemonStub::HandleGetConnectedDeviceList(MessageParcel &data, MessagePar } return E_OK; } -} // namespace DistributedFile -} // namespace Storage -} // namespace OHOS \ No newline at end of file +} // namespace DistributedFile +} // namespace Storage +} // namespace OHOS \ No newline at end of file diff --git a/services/distributedfiledaemon/src/multiuser/os_account_observer.cpp b/services/distributedfiledaemon/src/multiuser/os_account_observer.cpp index f499eae53e31d83c882a270cbe7b51ea095586fe..5b4dad3cf94e0d14571eddb631c29f18fb9be776 100644 --- a/services/distributedfiledaemon/src/multiuser/os_account_observer.cpp +++ b/services/distributedfiledaemon/src/multiuser/os_account_observer.cpp @@ -28,7 +28,6 @@ namespace DistributedFile { using namespace std; namespace { static const std::string SAME_ACCOUNT = "account"; -const int32_t INVALID_USER_ID = -1; } // namespace OsAccountObserver::OsAccountObserver(const EventFwk::CommonEventSubscribeInfo &subscribeInfo) diff --git a/services/distributedfiledaemon/test/mock/include/daemon_mock.h b/services/distributedfiledaemon/test/mock/include/daemon_mock.h index 282afdd968a9976ae0decd5607c1fd82c86f8a0a..bc0c320a382305a5d6929bbc64757d92ebf2ce86 100644 --- a/services/distributedfiledaemon/test/mock/include/daemon_mock.h +++ b/services/distributedfiledaemon/test/mock/include/daemon_mock.h @@ -1,23 +1,23 @@ /* -* 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. + * 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 FILEMANAGEMENT_DFS_SERVICE_DAEMON_MOCK_H #define FILEMANAGEMENT_DFS_SERVICE_DAEMON_MOCK_H -#include #include "daemon.h" +#include namespace OHOS { namespace Storage { @@ -33,6 +33,12 @@ public: const std::string &dstPath, const std::string &remoteDeviceId, const std::string &sessionName)); + MOCK_METHOD5(RequestSendFileACL, + int32_t(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo)); MOCK_METHOD5(PrepareSession, int32_t(const std::string &srcUri, const std::string &dstUri, @@ -42,11 +48,10 @@ public: MOCK_METHOD1(CancelCopyTask, int32_t(const std::string &sessionName)); MOCK_METHOD2(CancelCopyTask, int32_t(const std::string &srcUri, const std::string &dstUri)); MOCK_METHOD3(GetRemoteCopyInfo, int32_t(const std::string &srcUri, bool &isFile, bool &isDir)); - + MOCK_METHOD4(GetRemoteCopyInfoACL, + int32_t(const std::string &srcUri, bool &isFile, bool &isDir, const AccountInfo &callerAccountInfo)); MOCK_METHOD3(PushAsset, - int32_t(int32_t userId, - const sptr &assetObj, - const sptr &sendCallback)); + int32_t(int32_t userId, const sptr &assetObj, const sptr &sendCallback)); MOCK_METHOD1(RegisterAssetCallback, int32_t(const sptr &recvCallback)); MOCK_METHOD1(UnRegisterAssetCallback, int32_t(const sptr &recvCallback)); MOCK_METHOD3(GetDfsUrisDirFromLocal, int32_t(const std::vector &uriList, diff --git a/services/distributedfiledaemon/test/unittest/BUILD.gn b/services/distributedfiledaemon/test/unittest/BUILD.gn index f6c8f2bf365f945ea908ae59471ddd8bb93385fe..173baf606c792b8855f18919350a1885501b76ee 100644 --- a/services/distributedfiledaemon/test/unittest/BUILD.gn +++ b/services/distributedfiledaemon/test/unittest/BUILD.gn @@ -55,6 +55,7 @@ ohos_unittest("device_info_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", diff --git a/services/distributedfiledaemon/test/unittest/device/device_profile_adapter/device_profile_adapter_test.cpp b/services/distributedfiledaemon/test/unittest/device/device_profile_adapter/device_profile_adapter_test.cpp index 11448576653ed400bafd665350100f84ba0b232f..1274f1902ae0cf77bbdca5ab8d808bd58fc1157f 100644 --- a/services/distributedfiledaemon/test/unittest/device/device_profile_adapter/device_profile_adapter_test.cpp +++ b/services/distributedfiledaemon/test/unittest/device/device_profile_adapter/device_profile_adapter_test.cpp @@ -102,53 +102,53 @@ void DeviceProfileAdapterTest::TearDown(void) } /** - * @tc.name: DeviceProfileAdapterTest_IsRemoteDfsVersionLower_001 + * @tc.name: DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanLocal_001 * @tc.desc: verify PublishSA. * @tc.type: FUNC * @tc.require: I7TDJK */ -HWTEST_F(DeviceProfileAdapterTest, DeviceProfileAdapterTest_IsRemoteDfsVersionLower_001, TestSize.Level1) +HWTEST_F(DeviceProfileAdapterTest, DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanLocal_001, TestSize.Level1) { - GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLower_001 begin"; + GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanLocal_001 begin"; g_GetLocalDeviceInfo = ERR_BAD_VALUE; - auto ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLower(""); + auto ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanLocal(""); EXPECT_EQ(ret, false); g_GetLocalDeviceInfo = FileManagement::ERR_OK; g_GetUdidByNetworkId = FileManagement::ERR_OK; g_GetCharacteristicProfile = FileManagement::ERR_OK; - ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLower(""); + ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanLocal(""); EXPECT_EQ(ret, false); - GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLower_001 end"; + GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanLocal_001 end"; } /** - * @tc.name: DeviceProfileAdapterTest_IsRemoteDfsVersionLower_002 + * @tc.name: DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanGiven_002 * @tc.desc: verify PublishSA. * @tc.type: FUNC * @tc.require: I7TDJK */ -HWTEST_F(DeviceProfileAdapterTest, DeviceProfileAdapterTest_IsRemoteDfsVersionLower_002, TestSize.Level1) +HWTEST_F(DeviceProfileAdapterTest, DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanGiven_002, TestSize.Level1) { - GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLower_002 begin"; + GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanGiven_002 begin"; - auto ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLower("", {0, 0, 0}); + auto ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanGiven("", {0, 0, 0}); EXPECT_EQ(ret, false); g_GetUdidByNetworkId = -1; std::string remoteNetworkId = "remoteTest"; - ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLower(remoteNetworkId, {0, 0, 0}); + ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanGiven(remoteNetworkId, {0, 0, 0}); EXPECT_EQ(ret, false); g_GetUdidByNetworkId = FileManagement::ERR_OK; g_GetCharacteristicProfile = FileManagement::ERR_OK; DfsVersion thresholdDfsVersion = {99, 99, 99}; - ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLower(remoteNetworkId, thresholdDfsVersion); + ret = DeviceProfileAdapter::GetInstance().IsRemoteDfsVersionLowerThanGiven(remoteNetworkId, thresholdDfsVersion); EXPECT_EQ(ret, true); - GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLower_002 end"; + GTEST_LOG_(INFO) << "DeviceProfileAdapterTest_IsRemoteDfsVersionLowerThanGiven_002 end"; } /** diff --git a/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp b/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp index 85fd35d67c689d520b52ade6a8aed72af7c7c00b..0942de797e97665151a2d3403031820043b98cf6 100644 --- a/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp +++ b/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp @@ -64,6 +64,10 @@ bool g_subscribeCommonEvent; bool g_unSubscribeCommonEvent; int32_t g_getDfsVersionFromNetworkId = 0; OHOS::Storage::DistributedFile::DfsVersion g_dfsVersion; +bool g_isRemoteDfsVersionLowerThanGiven = false; +bool g_checkSrcPermission = true; +bool g_getLocalAccountInfo = true; +bool g_checkSinkPermission = true; } // namespace namespace { @@ -94,6 +98,28 @@ int32_t DeviceProfileAdapter::GetDfsVersionFromNetworkId(const std::string &netw dfsVersion = g_dfsVersion; return g_getDfsVersionFromNetworkId; } + +bool DeviceProfileAdapter::IsRemoteDfsVersionLowerThanGiven(const std::string &remoteNetworkId, + const DfsVersion &givenDfsVersion, + VersionPackageName packageName) +{ + return g_isRemoteDfsVersionLowerThanGiven; +} + +bool SoftBusPermissionCheck::CheckSrcPermission(const std::string &sinkNetworkId) +{ + return g_checkSrcPermission; +} + +bool SoftBusPermissionCheck::GetLocalAccountInfo(AccountInfo &localAccountInfo) +{ + return g_getLocalAccountInfo; +} + +bool SoftBusPermissionCheck::CheckSinkPermission(const AccountInfo &callerAccountInfo) +{ + return g_checkSinkPermission; +} } // namespace OHOS::Storage::DistributedFile namespace OHOS::FileManagement { @@ -252,10 +278,6 @@ void DaemonTest::SetUpTestCase(void) ISoftBusHandlerAssetMock::iSoftBusHandlerAssetMock_ = softBusHandlerAssetMock_; softBusHandlerMock_ = std::make_shared(); ISoftBusHandlerMock::iSoftBusHandlerMock_ = softBusHandlerMock_; - deviceManagerImplMock_ = std::make_shared(); - DfsDeviceManagerImpl::dfsDeviceManagerImpl = deviceManagerImplMock_; - channelManagerMock_ = std::make_shared(); - IChannelManagerMock::iChannelManagerMock = channelManagerMock_; std::string path = "/mnt/hmdfs/100/account/device_view/local/data/com.example.app"; if (!std::filesystem::exists(path)) { @@ -268,8 +290,6 @@ void DaemonTest::SetUpTestCase(void) } std::ofstream file(path + "/docs/1.txt"); std::ofstream file1(path + "/docs/1@.txt"); - g_getDfsVersionFromNetworkId = 0; - g_dfsVersion = {0, 0, 0}; } void DaemonTest::TearDownTestCase(void) @@ -287,12 +307,6 @@ void DaemonTest::TearDownTestCase(void) softBusHandlerAssetMock_ = nullptr; ISoftBusHandlerMock::iSoftBusHandlerMock_ = nullptr; softBusHandlerMock_ = nullptr; - deviceManagerImplMock_ = nullptr; - DfsDeviceManagerImpl::dfsDeviceManagerImpl = nullptr; - channelManagerMock_ = nullptr; - IChannelManagerMock::iChannelManagerMock = nullptr; - deviceManagerImplMock_ = nullptr; - DfsDeviceManagerImpl::dfsDeviceManagerImpl = nullptr; std::string path = "/mnt/hmdfs/100/account/device_view/local/data/com.example.app"; if (std::filesystem::exists(path)) { @@ -307,12 +321,27 @@ void DaemonTest::SetUp(void) bool runOnCreate = true; daemon_ = new (std::nothrow) Daemon(saID, runOnCreate); ASSERT_TRUE(daemon_ != nullptr) << "daemon_ assert failed!"; + deviceManagerImplMock_ = std::make_shared(); + DfsDeviceManagerImpl::dfsDeviceManagerImpl = deviceManagerImplMock_; + channelManagerMock_ = std::make_shared(); + IChannelManagerMock::iChannelManagerMock = channelManagerMock_; + + g_getDfsVersionFromNetworkId = 0; + g_dfsVersion = {0, 0, 0}; + g_isRemoteDfsVersionLowerThanGiven = false; + g_checkSrcPermission = true; + g_getLocalAccountInfo = true; + g_checkSinkPermission = true; } void DaemonTest::TearDown(void) { GTEST_LOG_(INFO) << "TearDown"; daemon_ = nullptr; + deviceManagerImplMock_ = nullptr; + DfsDeviceManagerImpl::dfsDeviceManagerImpl = nullptr; + channelManagerMock_ = nullptr; + IChannelManagerMock::iChannelManagerMock = nullptr; } /** @@ -680,22 +709,30 @@ HWTEST_F(DaemonTest, DaemonTest_RequestSendFile_001, TestSize.Level1) g_getCallingNetworkId = "testNetWork1"; std::vector deviceList; deviceList.push_back(deviceInfo); +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif daemon_->eventHandler_ = nullptr; EXPECT_EQ(daemon_->RequestSendFile("", "", "", ""), E_EVENT_HANDLER); +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif EXPECT_EQ(daemon_->RequestSendFile("../srcUri", "", "", ""), E_ILLEGAL_URI); +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif EXPECT_EQ(daemon_->RequestSendFile("", "../dstUri", "", ""), E_ILLEGAL_URI); daemon_->StartEventHandler(); +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif EXPECT_EQ(daemon_->RequestSendFile("", "", "", ""), ERR_BAD_VALUE); GTEST_LOG_(INFO) << "DaemonTest_RequestSendFile_001 end"; } @@ -841,39 +878,52 @@ HWTEST_F(DaemonTest, DaemonTest_GetRealPath_001, TestSize.Level1) ASSERT_NE(daemon_, nullptr); std::string physicalPath; HmdfsInfo info; - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, nullptr), E_INVAL_ARG_NAPI); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, nullptr, "networkId"), E_INVAL_ARG_NAPI); sptr daemon = new (std::nothrow) DaemonMock(); ASSERT_TRUE(daemon != nullptr) << "daemon assert failed!"; - EXPECT_EQ(daemon_->GetRealPath("../srcUri", "", physicalPath, info, daemon), E_ILLEGAL_URI); + EXPECT_EQ(daemon_->GetRealPath("../srcUri", "", physicalPath, info, daemon, "networkId"), E_ILLEGAL_URI); + + EXPECT_EQ(daemon_->GetRealPath("", "../dstUri", physicalPath, info, daemon, "networkId"), E_ILLEGAL_URI); + + g_checkSrcPermission = false; + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), ERR_ACL_FAILED); + + g_checkSrcPermission = true; + g_getLocalAccountInfo = false; + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), ERR_ACL_FAILED); - EXPECT_EQ(daemon_->GetRealPath("", "../dstUri", physicalPath, info, daemon), E_ILLEGAL_URI); + g_checkSrcPermission = true; + g_getLocalAccountInfo = true; + EXPECT_CALL(*daemon, GetRemoteCopyInfoACL(_, _, _, _)).WillOnce(Return(ERR_BAD_VALUE)); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_SOFTBUS_SESSION_FAILED); + g_isRemoteDfsVersionLowerThanGiven = true; EXPECT_CALL(*daemon, GetRemoteCopyInfo(_, _, _)).WillOnce(Return(ERR_BAD_VALUE)); - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon), E_SOFTBUS_SESSION_FAILED); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_SOFTBUS_SESSION_FAILED); g_getHapTokenInfo = ERR_BAD_VALUE; EXPECT_CALL(*daemon, GetRemoteCopyInfo(_, _, _)).WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon), E_GET_USER_ID); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_GET_USER_ID); g_getHapTokenInfo = Security::AccessToken::AccessTokenKitRet::RET_SUCCESS; g_getPhysicalPath = ERR_BAD_VALUE; EXPECT_CALL(*daemon, GetRemoteCopyInfo(_, _, _)).WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon), E_GET_PHYSICAL_PATH_FAILED); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_GET_PHYSICAL_PATH_FAILED); g_getPhysicalPath = E_OK; g_checkValidPath = false; info.dirExistFlag = false; EXPECT_CALL(*daemon, GetRemoteCopyInfo(_, _, _)).WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon), E_GET_PHYSICAL_PATH_FAILED); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_GET_PHYSICAL_PATH_FAILED); g_checkValidPath = true; g_physicalPath = "test@test/test"; info.dirExistFlag = true; std::string dstUri = "file://com.example.app/data/storage/el2/distributedfiles/images/1.png"; EXPECT_CALL(*daemon, GetRemoteCopyInfo(_, _, _)).WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon), E_OK); + EXPECT_EQ(daemon_->GetRealPath("", "", physicalPath, info, daemon, "networkId"), E_OK); GTEST_LOG_(INFO) << "DaemonTest_GetRealPath_001 end"; } @@ -995,18 +1045,22 @@ HWTEST_F(DaemonTest, DaemonTest_GetRemoteCopyInfo_001, TestSize.Level1) ASSERT_NE(daemon_, nullptr); g_getCallingNetworkId = "testNetWork1"; std::vector deviceList; - (void)memcpy_s(deviceInfo.networkId, DM_MAX_DEVICE_NAME_LEN - 1, - NETWORKID_ONE.c_str(), NETWORKID_ONE.size()); + (void)memcpy_s(deviceInfo.networkId, DM_MAX_DEVICE_NAME_LEN - 1, NETWORKID_ONE.c_str(), NETWORKID_ONE.size()); deviceList.push_back(deviceInfo); +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif + EXPECT_CALL(*softBusSessionListenerMock_, GetRealPath(_)).WillOnce(Return("")); bool isSrcFile = false; bool srcIsDir = false; EXPECT_EQ(daemon_->GetRemoteCopyInfo("", isSrcFile, srcIsDir), E_SOFTBUS_SESSION_FAILED); - +#ifdef SUPPORT_SAME_ACCOUNT EXPECT_CALL(*deviceManagerImplMock_, GetTrustedDeviceList(_, _, _)) .WillOnce(DoAll(SetArgReferee<2>(deviceList), Return(0))); +#endif + EXPECT_CALL(*softBusSessionListenerMock_, GetRealPath(_)).WillOnce(Return("test")); EXPECT_EQ(daemon_->GetRemoteCopyInfo("", isSrcFile, srcIsDir), E_OK); GTEST_LOG_(INFO) << "DaemonTest_GetRemoteCopyInfo_001 end"; @@ -1079,40 +1133,50 @@ HWTEST_F(DaemonTest, DaemonTest_GetRemoteSA_001, TestSize.Level1) HWTEST_F(DaemonTest, DaemonTest_Copy_001, TestSize.Level1) { GTEST_LOG_(INFO) << "DaemonTest_Copy_001 begin"; - ASSERT_NE(daemon_, nullptr); - EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)) - .WillOnce(Return(ERR_BAD_VALUE)); - EXPECT_EQ(daemon_->Copy("", "", nullptr, ""), E_GET_DEVICE_ID); - EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)) - .WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->Copy("", "", nullptr, ""), E_INVAL_ARG_NAPI); + EXPECT_EQ(daemon_->Copy("", "", nullptr, "", "networkId"), E_INVAL_ARG_NAPI); - EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)) - .WillOnce(Return(E_OK)); sptr daemon = new (std::nothrow) DaemonMock(); ASSERT_TRUE(daemon != nullptr) << "daemon assert failed!"; - EXPECT_CALL(*daemon, RequestSendFile(_, _, _, _)).WillOnce(Return(ERR_BAD_VALUE)); - EXPECT_EQ(daemon_->Copy("", "", daemon, ""), E_SA_LOAD_FAILED); - - EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)) - .WillOnce(Return(E_OK)); - EXPECT_CALL(*daemon, RequestSendFile(_, _, _, _)).WillOnce(Return(E_OK)); - EXPECT_EQ(daemon_->Copy("", "", daemon, ""), E_OK); string srcUri = "file://docs/storage/media/100/local/files/Docs/../A/1.txt"; string destPath = "/storage/media/100/local/files/Docs/aa1/"; - EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, ""), E_INVAL_ARG); + EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, "", "networkId"), E_INVAL_ARG); srcUri = "file://docs/storage/media/100/local/files/Docs/../A/1.txt?networkid=123456"; - EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, ""), E_INVAL_ARG); + EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, "", "networkId"), E_INVAL_ARG); srcUri = "file://docs/storage/media/100/local/files/Docs/1.txt"; destPath = "/storage/media/100/local/files/Docs/../aa1/"; - EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, ""), E_INVAL_ARG); + EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, "", "networkId"), E_INVAL_ARG); destPath = "/storage/media/100/local/files/Docs/../aa1/?networkid=123456"; - EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, ""), E_INVAL_ARG); + EXPECT_EQ(daemon_->Copy(srcUri, destPath, daemon, "", "networkId"), E_INVAL_ARG); + + EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)).WillOnce(Return(ERR_BAD_VALUE)); + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), E_GET_DEVICE_ID); + + EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)).WillRepeatedly(Return(E_OK)); + g_checkSrcPermission = false; + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), ERR_ACL_FAILED); + + g_checkSrcPermission = true; + g_getLocalAccountInfo = false; + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), ERR_ACL_FAILED); + + g_checkSrcPermission = true; + g_getLocalAccountInfo = true; + EXPECT_CALL(*daemon, RequestSendFileACL(_, _, _, _, _)).WillOnce(Return(ERR_BAD_VALUE)); + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), E_SA_LOAD_FAILED); + + g_isRemoteDfsVersionLowerThanGiven = true; + EXPECT_CALL(*daemon, RequestSendFile(_, _, _, _)).WillOnce(Return(ERR_BAD_VALUE)); + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), E_SA_LOAD_FAILED); + + EXPECT_CALL(*deviceManagerImplMock_, GetLocalDeviceInfo(_, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*daemon, RequestSendFile(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_EQ(daemon_->Copy("", "", daemon, "", "networkId"), E_OK); + GTEST_LOG_(INFO) << "DaemonTest_Copy_001 end"; } @@ -1480,5 +1544,49 @@ HWTEST_F(DaemonTest, DaemonTest_NotifyRemoteCancelNotification_001, TestSize.Lev GTEST_LOG_(INFO) << "DaemonTest_NotifyRemoteCancelNotification_001"; } + +/** + * @tc.name: DaemonTest_RequestSendFileACL_001 + * @tc.desc: verify RequestSendFileACL. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DaemonTest, DaemonTest_RequestSendFileACL_001, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DaemonTest_RequestSendFileACL_001 begin"; + + AccountInfo accountInfo; + g_checkSinkPermission = false; + EXPECT_EQ(daemon_->RequestSendFileACL("", "", "", "", accountInfo), ERR_ACL_FAILED); + + g_checkSinkPermission = true; + EXPECT_EQ(daemon_->RequestSendFileACL("", "", "", "", accountInfo), E_EVENT_HANDLER); + + GTEST_LOG_(INFO) << "DaemonTest_RequestSendFileACL_001 end"; +} + +/** + * @tc.name: DaemonTest_GetRemoteCopyInfoACL_001 + * @tc.desc: verify GetRemoteCopyInfoACL. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DaemonTest, DaemonTest_GetRemoteCopyInfoACL_001, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DaemonTest_GetRemoteCopyInfoACL_001 begin"; + + AccountInfo accountInfo; + bool isSrcFile = false; + bool srcIsDir = false; + + g_checkSinkPermission = false; + EXPECT_EQ(daemon_->GetRemoteCopyInfoACL("", isSrcFile, srcIsDir, accountInfo), ERR_ACL_FAILED); + + g_checkSinkPermission = true; + EXPECT_CALL(*softBusSessionListenerMock_, GetRealPath(_)).WillOnce(Return("test")); + EXPECT_EQ(daemon_->GetRemoteCopyInfoACL("", isSrcFile, srcIsDir, accountInfo), E_OK); + + GTEST_LOG_(INFO) << "DaemonTest_RequestSendFileACL_001 end"; +} } // namespace Test } // namespace OHOS::Storage::DistributedFile \ No newline at end of file diff --git a/services/distributedfiledaemon/test/unittest/ipc/daemon_execute/daemon_execute_test.cpp b/services/distributedfiledaemon/test/unittest/ipc/daemon_execute/daemon_execute_test.cpp index b83428bfc84723aba805274aae7dee2fcede9305..fa6077549dfdcc2fbd59cbbbf2c8ad080062237c 100644 --- a/services/distributedfiledaemon/test/unittest/ipc/daemon_execute/daemon_execute_test.cpp +++ b/services/distributedfiledaemon/test/unittest/ipc/daemon_execute/daemon_execute_test.cpp @@ -399,7 +399,7 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_PrepareSessionInner_001, TestSize.Leve ASSERT_NE(daemonExecute_, nullptr); // Test case 1: CreateSessionServer fails EXPECT_CALL(*softBusHandlerMock_, CreateSessionServer(_, _, _, _)).WillOnce(Return(-1)); - EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info), + EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info, "networkId"), E_SOFTBUS_SESSION_FAILED); GTEST_LOG_(INFO) << "DaemonExecute_PrepareSessionInner_001 end"; @@ -423,7 +423,8 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_PrepareSessionInner_002, TestSize.Leve ASSERT_NE(daemonExecute_, nullptr); // Test case 2: CreateSessionServer success but daemon is nullptr EXPECT_CALL(*softBusHandlerMock_, CreateSessionServer(_, _, _, _)).WillOnce(Return(1)); - EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info), E_INVAL_ARG_NAPI); + EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info, "networkId"), + E_INVAL_ARG_NAPI); GTEST_LOG_(INFO) << "DaemonExecute_PrepareSessionInner_002 end"; } @@ -447,7 +448,8 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_PrepareSessionInner_003, TestSize.Leve ASSERT_NE(daemonExecute_, nullptr); // Test case 3: CreateSessionServer succeeds, but authority is not media or docs EXPECT_CALL(*softBusHandlerMock_, CreateSessionServer(_, _, _, _)).WillOnce(Return(1)); - EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info), E_OK); + EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info, "networkId"), + ERR_ACL_FAILED); GTEST_LOG_(INFO) << "DaemonExecute_PrepareSessionInner_003 end"; } @@ -473,7 +475,8 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_PrepareSessionInner_004, TestSize.Leve // Test case 4: CreateSessionServer succeeds, authority is media or docs, but Copy fails EXPECT_CALL(*softBusHandlerMock_, CreateSessionServer(_, _, _, _)).WillOnce(Return(1)); - EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info), E_OK); + EXPECT_EQ(daemonExecute_->PrepareSessionInner(srcUri, physicalPath, sessionName, daemon, info, "networkId"), + ERR_ACL_FAILED); GTEST_LOG_(INFO) << "DaemonExecute_PrepareSessionInner_004 end"; } @@ -532,7 +535,7 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_ExecutePrepareSession_003, TestSize.Le // // Initialize the PrepareSessionData auto prepareSessionData = - std::make_shared(srcUri, physicalPath, sessionName, daemon, info, nullBlock); + std::make_shared(srcUri, physicalPath, sessionName, daemon, info, nullBlock, "networkId"); // Initialize InnerEvent auto event = AppExecFwk::InnerEvent::Get(DEAMON_EXECUTE_PREPARE_SESSION, prepareSessionData); @@ -561,7 +564,7 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_ExecutePrepareSession_004, TestSize.Le // Initialize PrepareSessionData auto prepareSessionData = std::make_shared("test_uri", "test_path", "test_session", daemon, - info, prepareSessionBlock); + info, prepareSessionBlock, "networkId"); auto event = AppExecFwk::InnerEvent::Get(DEAMON_EXECUTE_PREPARE_SESSION, prepareSessionData, 0); @@ -570,7 +573,7 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_ExecutePrepareSession_004, TestSize.Le ASSERT_NE(daemonExecute_, nullptr); EXPECT_NO_THROW(daemonExecute_->ExecutePrepareSession(event)); - EXPECT_EQ(prepareSessionBlock->GetValue(), E_OK); + EXPECT_EQ(prepareSessionBlock->GetValue(), ERR_ACL_FAILED); GTEST_LOG_(INFO) << "DaemonExecute_ExecutePrepareSession_004 end"; } @@ -593,7 +596,7 @@ HWTEST_F(DaemonExecuteTest, DaemonExecute_ExecutePrepareSession_005, TestSize.Le // Initialize PrepareSessionData auto prepareSessionData = std::make_shared("test_uri", "test_path", "test_session", daemon, - info, prepareSessionBlock); + info, prepareSessionBlock, "networkId"); auto event = AppExecFwk::InnerEvent::Get(DEAMON_EXECUTE_PREPARE_SESSION, prepareSessionData, 0); diff --git a/test/fuzztest/daemonstub_fuzzer/BUILD.gn b/test/fuzztest/daemonstub_fuzzer/BUILD.gn index 67ed23b8e10ac2d503beb67627ca7fb2802fc200..d6d28bcbac733504e06c5b513715e89eac430bdc 100644 --- a/test/fuzztest/daemonstub_fuzzer/BUILD.gn +++ b/test/fuzztest/daemonstub_fuzzer/BUILD.gn @@ -47,6 +47,7 @@ ohos_fuzztest("DaemonStubFuzzTest") { "cJSON:cjson_static", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_single", diff --git a/test/fuzztest/daemonstub_fuzzer/daemonstub_fuzzer.cpp b/test/fuzztest/daemonstub_fuzzer/daemonstub_fuzzer.cpp index 717f38bb2cb140ba547df75d955d216fe73631a1..eeb232accce31e8f3a4f9f037dc9267ef4ab5721 100644 --- a/test/fuzztest/daemonstub_fuzzer/daemonstub_fuzzer.cpp +++ b/test/fuzztest/daemonstub_fuzzer/daemonstub_fuzzer.cpp @@ -98,12 +98,28 @@ public: { return 0; } + int32_t RequestSendFileACL(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo) override + { + return 0; + } int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) override { return 0; } + int32_t GetRemoteCopyInfoACL(const std::string &srcUri, + bool &isFile, + bool &isDir, + const AccountInfo &callerAccountInfo) override + { + return 0; + } + int32_t PushAsset(int32_t userId, const sptr &assetObj, const sptr &sendCallback) override diff --git a/test/unittests/distributed_file_daemon/BUILD.gn b/test/unittests/distributed_file_daemon/BUILD.gn index 6901ce3bf154eddbd41805c280a8d0a41dd988f3..8aa6d75b3cf2ce57ce291437b32e27b9369024a5 100644 --- a/test/unittests/distributed_file_daemon/BUILD.gn +++ b/test/unittests/distributed_file_daemon/BUILD.gn @@ -250,6 +250,7 @@ ohos_unittest("daemon_manager_impl_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -346,6 +347,7 @@ ohos_unittest("daemon_service_proxy_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", diff --git a/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp b/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp index bc11759f130c9e568c11bba1f6c77acbdb40b474..6700c660a97247074f79e1b7c04d30dc31f3f653 100644 --- a/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp +++ b/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp @@ -130,6 +130,12 @@ public: const std::string &dstPath, const std::string &remoteDeviceId, const std::string &sessionName)); + MOCK_METHOD5(RequestSendFileACL, + int32_t(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo)); MOCK_METHOD5(PrepareSession, int32_t(const std::string &srcUri, const std::string &dstUri, @@ -139,6 +145,8 @@ public: MOCK_METHOD1(CancelCopyTask, int32_t(const std::string &sessionName)); MOCK_METHOD2(CancelCopyTask, int32_t(const std::string &srcUri, const std::string &dstUri)); MOCK_METHOD3(GetRemoteCopyInfo, int32_t(const std::string &srcUri, bool &isFile, bool &isDir)); + MOCK_METHOD4(GetRemoteCopyInfoACL, + int32_t(const std::string &srcUri, bool &isFile, bool &isDir, const AccountInfo &callerAccountInfo)); MOCK_METHOD3(PushAsset, int32_t(int32_t userId, const sptr &assetObj, const sptr &sendCallback)); @@ -183,6 +191,7 @@ void DaemonStubSupPTest::TearDownTestCase(void) void DaemonStubSupPTest::SetUp(void) { GTEST_LOG_(INFO) << "SetUp"; + UID = DATA_UID; } void DaemonStubSupPTest::TearDown(void) @@ -635,6 +644,193 @@ HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleGetDfsUrisDirFromLocalTest, Test GTEST_LOG_(INFO) << "DaemonStubSupHandleGetDfsUrisDirFromLocalTest End"; } +/** + * @tc.name: DaemonStubSupHandleRequestSendFileACLTest_0001 + * @tc.desc: Verify the HandleRequestSendFileACL function (read failures) + * @tc.type: FUNC + * @tc.require: I7M6L1 + */ +HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleRequestSendFileACLTest_0001, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileACLTest_0001 Start"; + MessageParcel data; + MessageParcel reply; + + g_getCallingUidTrue = true; + // Test srcUri read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(false)); + auto ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test dstPath read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(false)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test dstDeviceId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(false)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test sessionName read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(false)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test userId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileACLTest_0001 End"; +} + +/** + * @tc.name: DaemonStubSupHandleRequestSendFileACLTest_0002 + * @tc.desc: Verify the HandleRequestSendFileACL function (success cases) + * @tc.type: FUNC + * @tc.require: I7M6L1 + */ +HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleRequestSendFileACLTest_0002, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileACLTest_0002 Start"; + MessageParcel data; + MessageParcel reply; + + g_getCallingUidTrue = true; + // Test accountId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + auto ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test networkId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test success path + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, RequestSendFileACL(_, _, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_OK); + + // Test RequestSendFileACL returns error + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, RequestSendFileACL(_, _, _, _, _)).WillOnce(Return(E_INVAL_ARG)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleRequestSendFileACL(data, reply); + EXPECT_EQ(ret, E_INVAL_ARG); + + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileACLTest_0002 End"; +} + +/** + * @tc.name: DaemonStubSupHandleGetRemoteCopyInfoACLTest_0001 + * @tc.desc: Verify the HandleGetRemoteCopyInfoACL function (read failures) + * @tc.type: FUNC + * @tc.require: I7M6L1 + */ +HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleGetRemoteCopyInfoACLTest_0001, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "DaemonStubSupHandleGetRemoteCopyInfoACLTest_0001 Start"; + MessageParcel data; + MessageParcel reply; + + g_getCallingUidTrue = true; + // Test srcUri read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(false)); + auto ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test userId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test accountId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + // Test networkId read failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_READ_FAILED); + + GTEST_LOG_(INFO) << "DaemonStubSupHandleGetRemoteCopyInfoACLTest_0001 End"; +} + +/** + * @tc.name: DaemonStubSupHandleGetRemoteCopyInfoACLTest_0002 + * @tc.desc: Verify the HandleGetRemoteCopyInfoACL function (write and success cases) + * @tc.type: FUNC + * @tc.require: I7M6L1 + */ +HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleGetRemoteCopyInfoACLTest_0002, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "DaemonStubSupHandleGetRemoteCopyInfoACLTest_0002 Start"; + MessageParcel data; + MessageParcel reply; + + g_getCallingUidTrue = true; + // Test isFile write failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, GetRemoteCopyInfoACL(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(false)); + auto ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_WRITE_FAILED); + + // Test isDir write failure + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, GetRemoteCopyInfoACL(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)).WillOnce(Return(false)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_IPC_WRITE_FAILED); + + // Test success path + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, GetRemoteCopyInfoACL(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_OK); + + // Test GetRemoteCopyInfoACL returns error + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, GetRemoteCopyInfoACL(_, _, _, _)).WillOnce(Return(E_INVAL_ARG)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + ret = daemonStub_->HandleGetRemoteCopyInfoACL(data, reply); + EXPECT_EQ(ret, E_INVAL_ARG); + + GTEST_LOG_(INFO) << "DaemonStubSupHandleGetRemoteCopyInfoACLTest_0002 End"; +} + /** * @tc.name: DaemonStubSupHandleGetDfsSwitchStatus * @tc.desc: Verify the HandleGetDfsSwitchStatus function diff --git a/test/unittests/distributed_file_daemon/daemon_stub_test.cpp b/test/unittests/distributed_file_daemon/daemon_stub_test.cpp index 5c1f83db124de5ff8eaf78a7a52b94eba3b2c7b2..bd980415bc6c2fc7823da1a4ed25e07b1f72e317 100644 --- a/test/unittests/distributed_file_daemon/daemon_stub_test.cpp +++ b/test/unittests/distributed_file_daemon/daemon_stub_test.cpp @@ -75,6 +75,12 @@ public: const std::string &dstPath, const std::string &remoteDeviceId, const std::string &sessionName)); + MOCK_METHOD5(RequestSendFileACL, + int32_t(const std::string &srcUri, + const std::string &dstPath, + const std::string &remoteDeviceId, + const std::string &sessionName, + const AccountInfo &callerAccountInfo)); MOCK_METHOD5(PrepareSession, int32_t(const std::string &srcUri, const std::string &dstUri, @@ -84,6 +90,8 @@ public: MOCK_METHOD1(CancelCopyTask, int32_t(const std::string &sessionName)); MOCK_METHOD2(CancelCopyTask, int32_t(const std::string &srcUri, const std::string &dstUri)); MOCK_METHOD3(GetRemoteCopyInfo, int32_t(const std::string &srcUri, bool &isFile, bool &isDir)); + MOCK_METHOD4(GetRemoteCopyInfoACL, + int32_t(const std::string &srcUri, bool &isFile, bool &isDir, const AccountInfo &callerAccountInfo)); MOCK_METHOD3(PushAsset, int32_t(int32_t userId, diff --git a/test/unittests/distributed_file_daemon/include/i_daemon_mock.h b/test/unittests/distributed_file_daemon/include/i_daemon_mock.h index d69d040cdd4eaeb979d0a3177620e3b7cb11ef60..91e9b7213820e7bc716d263b1dba19a3ddaa1f66 100644 --- a/test/unittests/distributed_file_daemon/include/i_daemon_mock.h +++ b/test/unittests/distributed_file_daemon/include/i_daemon_mock.h @@ -77,11 +77,24 @@ public: return FileManagement::E_OK; } + int32_t RequestSendFileACL(const std::string &srcUri, const std::string &dstPath, + const std::string &remoteDeviceId, const std::string &sessionName, + const AccountInfo &callerAccountInfo) + { + return FileManagement::E_OK; + } + int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) { return FileManagement::E_OK; } + int32_t GetRemoteCopyInfoACL(const std::string &srcUri, bool &isFile, bool &isDir, + const AccountInfo &callerAccountInfo) + { + return FileManagement::E_OK; + } + int32_t CancelCopyTask(const std::string &sessionName) { return FileManagement::E_OK; diff --git a/test/unittests/distributed_file_inner/BUILD.gn b/test/unittests/distributed_file_inner/BUILD.gn index 9257f8ef54cc8452694adf59390db22f956e629b..cd508452c479e4007b44f2f9837529740559eaaf 100644 --- a/test/unittests/distributed_file_inner/BUILD.gn +++ b/test/unittests/distributed_file_inner/BUILD.gn @@ -52,6 +52,7 @@ ohos_unittest("distributed_file_daemon_proxy_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -101,6 +102,7 @@ ohos_unittest("distributed_file_daemon_proxy_sup_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -193,6 +195,7 @@ ohos_unittest("asset_recv_callback_stub_test") { external_deps = [ "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -241,6 +244,7 @@ ohos_unittest("asset_send_callback_stub_test") { external_deps = [ "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -299,6 +303,7 @@ ohos_unittest("file_copy_manager_test") { "c_utils:utils", "data_share:datashare_consumer", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -363,6 +368,7 @@ ohos_unittest("remote_file_copy_manager_test") { "c_utils:utils", "data_share:datashare_consumer", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -428,6 +434,7 @@ ohos_unittest("trans_listener_test") { "c_utils:utils", "data_share:datashare_consumer", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -492,6 +499,7 @@ ohos_unittest("file_size_utils_test") { "c_utils:utils", "data_share:datashare_consumer", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -544,6 +552,7 @@ ohos_unittest("file_copy_listener_test") { "ability_base:zuri", "app_file_service:fileuri_native", "c_utils:utils", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -596,6 +605,7 @@ ohos_unittest("file_mount_manager_test") { "app_file_service:remote_file_share_native", "c_utils:utils", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", @@ -695,6 +705,7 @@ ohos_unittest("ipc_wrapper_test") { "c_utils:utils", "data_share:datashare_consumer", "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", diff --git a/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp b/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp index ea9b1eb689be177b469e98090b67a5c6596fbc78..acbb9e9ae77fce0545142f882a71f36a20773887 100644 --- a/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp +++ b/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp @@ -83,30 +83,30 @@ public: void DistributedFileDaemonProxyTest::SetUpTestCase(void) { GTEST_LOG_(INFO) << "SetUpTestCase"; - mock_ = sptr(new DaemonServiceMock()); - proxy_ = make_shared(mock_); - messageParcelMock_ = make_shared(); - MessageParcelMock::messageParcel = messageParcelMock_; } void DistributedFileDaemonProxyTest::TearDownTestCase(void) { GTEST_LOG_(INFO) << "TearDownTestCase"; - mock_ = nullptr; - proxy_ = nullptr; - messageParcelMock_ = nullptr; - MessageParcelMock::messageParcel = nullptr; } void DistributedFileDaemonProxyTest::SetUp(void) { - ASSERT_TRUE(mock_ != nullptr); GTEST_LOG_(INFO) << "SetUp"; + mock_ = sptr(new DaemonServiceMock()); + proxy_ = make_shared(mock_); + ASSERT_TRUE(mock_ != nullptr); + messageParcelMock_ = make_shared(); + MessageParcelMock::messageParcel = messageParcelMock_; } void DistributedFileDaemonProxyTest::TearDown(void) { GTEST_LOG_(INFO) << "TearDown"; + messageParcelMock_ = nullptr; + MessageParcelMock::messageParcel = nullptr; + mock_ = nullptr; + proxy_ = nullptr; } /** @@ -883,27 +883,27 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetDfsUrisDirFrom EXPECT_EQ(ret, E_BROKEN_IPC); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_INVAL_ARG)); ret = proxy_->GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps); EXPECT_EQ(ret, E_BROKEN_IPC); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); ret = proxy_->GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps); EXPECT_EQ(ret, E_BROKEN_IPC); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(DoAll(SetArgReferee<0>(E_INVAL_ARG), Return(true))); ret = proxy_->GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps); EXPECT_EQ(ret, E_INVAL_ARG); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(DoAll(SetArgReferee<0>(E_OK), Return(true))); ret = proxy_->GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps); @@ -928,7 +928,7 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetDfsUrisDirFrom g_context = "aa"; EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(DoAll(SetArgReferee<0>(E_OK), Return(true))); auto ret = proxy_->GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps); @@ -936,7 +936,7 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetDfsUrisDirFrom g_context = "1"; EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); - EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(DoAll(SetArgReferee<0>(E_OK), Return(true))); g_readBatchUris = E_INVAL_ARG; @@ -945,6 +945,229 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetDfsUrisDirFrom GTEST_LOG_(INFO) << "DistributedFileDaemon_GetDfsUrisDirFromLocal_0200 End"; } +/** + * @tc.name: DistributedFileDaemon_RequestSendFileACL_0100 + * @tc.desc: Verify RequestSendFileACL for parameter serialization failures. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_RequestSendFileACL_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DistributedFileDaemon_RequestSendFileACL_0100 Start"; + AccountInfo accountInfo{123, 0, "account_id", "network_id"}; + + // Test WriteInterfaceToken failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(false)); + auto ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test WriteString(srcUri) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(dstPath) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(2).WillOnce(Return(true)).WillOnce(Return(false)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(remoteDeviceId) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(false)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(sessionName) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(4).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(false)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteInt32(userId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(4).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(accountId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(5).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(networkId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(6).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + GTEST_LOG_(INFO) << "DistributedFileDaemon_RequestSendFileACL_0100 End"; +} + +/** + * @tc.name: DistributedFileDaemon_RequestSendFileACL_0200 + * @tc.desc: Verify RequestSendFileACL for remote object, IPC, and reply read failures, and success case. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_RequestSendFileACL_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DistributedFileDaemon_RequestSendFileACL_0200 Start"; + AccountInfo accountInfo{123, 0, "account_id", "network_id"}; + + // Test remote object null + auto testProxy = make_shared(nullptr); + auto ret = testProxy->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test SendRequest failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(6).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_INVAL_ARG)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test success case + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(6).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32()).Times(1).WillOnce(Return(E_OK)); + ret = proxy_->RequestSendFileACL("uri", "path", "deviceId", "test", accountInfo); + EXPECT_EQ(ret, E_OK); + + GTEST_LOG_(INFO) << "DistributedFileDaemon_RequestSendFileACL_0200 End"; +} + +/** + * @tc.name: DistributedFileDaemon_GetRemoteCopyInfoACL_0100 + * @tc.desc: Verify GetRemoteCopyInfoACL for parameter serialization failures. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetRemoteCopyInfoACL_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DistributedFileDaemon_GetRemoteCopyInfoACL_0100 Start"; + AccountInfo accountInfo{123, 0, "account_id", "network_id"}; + bool isFile = false; + bool isDir = false; + + // Test WriteInterfaceToken failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(false)); + auto ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test WriteString(srcUri) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteInt32(userId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(accountId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(2).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test WriteString(networkId_) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + GTEST_LOG_(INFO) << "DistributedFileDaemon_GetRemoteCopyInfoACL_0100 End"; +} + +/** + * @tc.name: DistributedFileDaemon_GetRemoteCopyInfoACL_0200 + * @tc.desc: Verify GetRemoteCopyInfoACL for remote object, IPC, and reply read failures, and success case. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_GetRemoteCopyInfoACL_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DistributedFileDaemon_GetRemoteCopyInfoACL_0200 Start"; + AccountInfo accountInfo{123, 0, "account_id", "network_id"}; + bool isFile = false; + bool isDir = false; + + // Test remote object null + auto testProxy = make_shared(nullptr); + auto ret = testProxy->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test SendRequest failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_INVAL_ARG)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_BROKEN_IPC); + + // Test ReadBool(isFile) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadBool(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test ReadBool(isDir) failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadBool(_)).Times(2).WillOnce(Return(true)).WillOnce(Return(false)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test ReadInt32 failure + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadBool(_)).Times(2).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).Times(1).WillOnce(Return(false)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_INVAL_ARG); + + // Test success case + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).Times(3).WillRepeatedly(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadBool(_)).Times(2).WillOnce(DoAll(SetArgReferee<0>(true), Return(true))) + .WillOnce(DoAll(SetArgReferee<0>(false), Return(true))); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).Times(1).WillOnce(Return(true)); + ret = proxy_->GetRemoteCopyInfoACL("uri", isFile, isDir, accountInfo); + EXPECT_EQ(ret, E_OK); + EXPECT_TRUE(isFile); + EXPECT_FALSE(isDir); + + GTEST_LOG_(INFO) << "DistributedFileDaemon_GetRemoteCopyInfoACL_0200 End"; +} + /** * @tc.name: DistributedFileDaemon_GetDfsSwitchStatus * @tc.desc: Verify GetDfsSwitchStatus function diff --git a/utils/log/include/dfs_error.h b/utils/log/include/dfs_error.h index b22e68b222d18e7f433181c43b1eddc1f21003f3..f471050e77249209437b7f9bd2b16fe397511285 100644 --- a/utils/log/include/dfs_error.h +++ b/utils/log/include/dfs_error.h @@ -148,6 +148,7 @@ enum DFSErrCode { ERR_CHECKOUT_COUNT, ERR_NULLPTR, + ERR_ACL_FAILED, /* dfs version */ ERR_DFS_VERSION_BASE = 1000,