diff --git a/common/include/dm_constants.h b/common/include/dm_constants.h index 0a2645f57234a62fd297432c44b7c54f216c1083..79d15eaa37d2649efb9782754a3029e178f5d3bd 100755 --- a/common/include/dm_constants.h +++ b/common/include/dm_constants.h @@ -185,6 +185,9 @@ extern const char* DM_VERSION_5_1_0; extern const char* DM_VERSION_5_1_1; extern const char* DM_ACL_AGING_VERSION; extern const char* DM_VERSION_5_0_OLD_MAX; // Estimated highest version number of the old version +extern const char* DM_OSTYPE; +extern const int32_t DM_HO_OSTYPE; +extern const int32_t DM_OH_OSTYPE; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DM_CONSTANTS_H diff --git a/common/src/dm_constants.cpp b/common/src/dm_constants.cpp index 9be2b9fb7155033e0478433413a1cc37f8615d6c..4b76f4999519991b822c7203f116892feb3478e0 100644 --- a/common/src/dm_constants.cpp +++ b/common/src/dm_constants.cpp @@ -173,5 +173,9 @@ const char* DM_VERSION_5_1_0 = "5.1.0"; const char* DM_VERSION_5_1_1 = "5.1.1"; const char* DM_ACL_AGING_VERSION = DM_VERSION_5_1_0; const char* DM_VERSION_5_0_OLD_MAX = "5.0.99"; // Estimated highest version number of the old version + +const char* DM_OSTYPE = "osType"; +const int32_t DM_HO_OSTYPE = 10; +const int32_t DM_OH_OSTYPE = -1; } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/commondependency/include/deviceprofile_connector.h b/commondependency/include/deviceprofile_connector.h index 1aa8990e17a5031f78fa60426d4f400ebc7c6ec6..014178479a48a921edc22233e6153f898f003410 100644 --- a/commondependency/include/deviceprofile_connector.h +++ b/commondependency/include/deviceprofile_connector.h @@ -315,6 +315,7 @@ public: const DmAccessCallee &callee, const std::string &sinkUdid); DM_EXPORT bool CheckSinkIsSameAccount(const DmAccessCaller &caller, const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid); + DM_EXPORT void DeleteAclByBackGroundUserId(const std::string &udid, const std::vector &backGroundUserIds); private: int32_t HandleDmAuthForm(DistributedDeviceProfile::AccessControlProfile profiles, DmDiscoveryInfo discoveryInfo); void GetParamBindTypeVec(DistributedDeviceProfile::AccessControlProfile profiles, std::string requestDeviceId, @@ -413,6 +414,7 @@ private: bool CheckSinkAppOrServiceP2PAcl(const DistributedDeviceProfile::AccessControlProfile &profile, const DmAccessCaller &caller, const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid); + bool CheckExtWhiteList(const std::string &bundleName); }; extern "C" IDeviceProfileConnector *CreateDpConnectorInstance(); diff --git a/commondependency/src/deviceprofile_connector.cpp b/commondependency/src/deviceprofile_connector.cpp index aebb454592cb4e7a111c4f40760fd0e374aa785a..6242806d3acbd009a259ab0f3326e93c6bf3f574 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -59,6 +59,10 @@ namespace { const int32_t DM_SUPPORT_ACL_AGING_VERSION_NUM = 1; const std::string DM_VERSION_STR_5_1_0 = DM_VERSION_5_1_0; const std::vector DM_SUPPORT_ACL_AGING_VERSIONS = {DM_VERSION_STR_5_1_0}; +constexpr uint32_t AUTH_EXT_WHITE_LIST_NUM = 1; +constexpr const static char* g_extWhiteList[AUTH_EXT_WHITE_LIST_NUM] = { + "CastEngineService", +}; } DM_IMPLEMENT_SINGLE_INSTANCE(DeviceProfileConnector); void PrintProfile(const AccessControlProfile &profile) @@ -3292,7 +3296,7 @@ DM_EXPORT bool DeviceProfileConnector::CheckSinkIsSameAccount(const DmAccessCall LOGI("srcUdid %{public}s, srcUserId %{public}d, srcPkgName %{public}s, srcTokenId %{public}d," "srcAccountId %{public}s, sinkUdid %{public}s, sinkUserId %{public}d, sinkPkgName %{public}s," "sinkTokenId %{public}d, sinkAccountId %{public}s.", GetAnonyString(srcUdid).c_str(), caller.userId, - caller.pkgName.c_str(), static_cast(caller.tokenId), GetAnonyString(caller.accountId).c_str(), + caller.pkgName.c_str(), static_cast(caller.tokenId), GetAnonyString(caller.accountId).c_str(), GetAnonyString(sinkUdid).c_str(), callee.userId, callee.pkgName.c_str(), static_cast(callee.tokenId), GetAnonyString(callee.accountId).c_str()); std::vector profiles = GetAllAccessControlProfile(); @@ -3311,6 +3315,54 @@ DM_EXPORT bool DeviceProfileConnector::CheckSinkIsSameAccount(const DmAccessCall return false; } +DM_EXPORT void DeviceProfileConnector::DeleteAclByBackGroundUserId(const std::string &udid, + const std::vector &backGroundUserIds) +{ + if (udid.empty() || backGroundUserIds.size() == 0) { + LOGE("invalid input param."); + return; + } + std::vector profiles = GetAllAccessControlProfile(); + std::string localUdid = GetLocalDeviceId(); + for (const auto &item : profiles) { + if (udid != item.GetTrustDeviceId()) { + continue; + } + std::string acerDeviceId = item.GetAccesser().GetAccesserDeviceId(); + int32_t acerUserId = profile.GetAccesser().GetAccesserUserId(); + std::string acerPkgName = profile.GetAccesser().GetAccesserBundleName(); + std::string aceeDeviceId = item.GetAccessee().GetAccesseeDeviceId(); + int32_t aceeUserId = profile.GetAccessee().GetAccesseeUserId(); + std::string aceePkgName = profile.GetAccessee().GetAccesseeBundleName(); + + if (localUdid == acerDeviceId && udid == aceeDeviceId && CheckExtWhiteList(acerPkgName) && + std::find(backGroundUserIds.begin(), backGroundUserIds.end(), acerUserId) != backGroundUserIds.end()) { + DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); + continue; + } + if (udid == acerDeviceId && localUdid == aceeDeviceId && CheckExtWhiteList(aceePkgName) && + std::find(backGroundUserIds.begin(), backGroundUserIds.end(), aceeUserId) != backGroundUserIds.end()) { + DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); + continue; + } + } +} + +bool DeviceProfileConnector::CheckExtWhiteList(const std::string &pkgName) +{ + LOGI("start pkgName %{public}s.", pkgName.c_str()); + if (pkgName.empty()) { + LOGE("bundleName empty."); + return false; + } + for (uint32_t index = 0 ; index < AUTH_EXT_WHITE_LIST_NUM ; index++) { + if (pkgName == g_extWhiteList[index]) { + return true; + } + } + return false; +} + IDeviceProfileConnector *CreateDpConnectorInstance() { return &DeviceProfileConnector::GetInstance(); diff --git a/services/implementation/src/device_manager_service_impl.cpp b/services/implementation/src/device_manager_service_impl.cpp index 0b8b831ace2c556c8e0a9071e0edbd2e8233e918..b2dfbb1a85a0f39ac72c24590b1207e2026e2b2b 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -2848,6 +2848,17 @@ bool DeviceManagerServiceImpl::CheckSinkIsSameAccount(const DmAccessCaller &call return DeviceProfileConnector::GetInstance().CheckSinkIsSameAccount(caller, srcUdid, callee, sinkUdid); } +void DeviceManagerServiceImpl::DeleteExtBackGroundUserTrustDev(const std::string &udid, + const std::vector &backGroundUserIds) +{ + LOGI("peerudid %{public}s, backGroundUserIds %{public}s.", GetIntegerList(udid).c_str(), + GetIntegerList(backGroundUserIds).c_str()); + //delete acl + DeviceProfileConnector::GetInstance().DeleteAclByBackGroundUserId(udid, backGroundUserIds); + //delete group + hiChainConnector_->DeleteAllGroupByUdid(udid); +} + extern "C" IDeviceManagerServiceImpl *CreateDMServiceObject(void) { return new DeviceManagerServiceImpl; diff --git a/services/implementation/src/device_manager_service_impl_lite.cpp b/services/implementation/src/device_manager_service_impl_lite.cpp index 43a2d5bd61305e7e102fc1d61a9bd7687c216a90..07ad5217623e7986d54f038659ae35f249a3499f 100644 --- a/services/implementation/src/device_manager_service_impl_lite.cpp +++ b/services/implementation/src/device_manager_service_impl_lite.cpp @@ -735,6 +735,14 @@ bool DeviceManagerServiceImpl::CheckSinkIsSameAccount(const DmAccessCaller &call return true; } +void DeviceManagerServiceImpl::DeleteExtBackGroundUserTrustDev(const std::string &udid, + const std::vector &backGroundUserIds) +{ + (void)udid; + (void)backGroundUserIds; + return; +} + extern "C" IDeviceManagerServiceImpl *CreateDMServiceObject(void) { return new DeviceManagerServiceImpl; diff --git a/services/service/include/device_manager_service.h b/services/service/include/device_manager_service.h index da3023d9a6460877d2eb3494b63c97d17115f651..e8ed41fe278a7523347df515561829615366193c 100644 --- a/services/service/include/device_manager_service.h +++ b/services/service/include/device_manager_service.h @@ -420,6 +420,9 @@ private: #endif bool GetAccessUdidByNetworkId(const std::string &srcNetWorkId, std::string &srcUdid, const std::string &sinkNetWorkId, std::string &sinkUdid); + void ProcessBackGroundUserTrustDevice(const std::string &udidHash, std::map &bindParam); + int32_t GetOsTypeByUdid(const std::string &udid, int32_t &ostype); + void DeleteExtBackGroundUserTrustDev(const std::string &udid); private: bool isImplsoLoaded_ = false; diff --git a/services/service/include/idevice_manager_service_impl.h b/services/service/include/idevice_manager_service_impl.h index 4c3ec2d36f69e1dd845b4f4e360e0c63628e6086..855105f5d1e61739b11193de5ac65d1c3d6bd8ae 100644 --- a/services/service/include/idevice_manager_service_impl.h +++ b/services/service/include/idevice_manager_service_impl.h @@ -285,6 +285,8 @@ public: const DmAccessCallee &callee, const std::string &sinkUdid) = 0; virtual bool CheckSinkIsSameAccount(const DmAccessCaller &caller, const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) = 0; + virtual void DeleteExtBackGroundUserTrustDev(const std::string &udid, + const std::vector &backGroundUserIds) = 0 }; using CreateDMServiceFuncPtr = IDeviceManagerServiceImpl *(*)(void); diff --git a/services/service/include/softbus/softbus_listener.h b/services/service/include/softbus/softbus_listener.h index e6e2ffbd76c8e59aa0db1ec2aa8bb972edda602e..356e1f0f80e4aca2b5d90dacee6b940961febd95 100644 --- a/services/service/include/softbus/softbus_listener.h +++ b/services/service/include/softbus/softbus_listener.h @@ -142,6 +142,8 @@ private: static int32_t GetAttrFromCustomData(const cJSON *const customDataJson, DmDeviceInfo &dmDevInfo, int32_t &actionId); static int32_t GetAttrFromExtraData(DmDeviceInfo &dmDevInfo, int32_t &actionId); + static void ConvertOsTypeToJson(int32_t osType, std::string &osTypeStr); + private: static std::string hostName_; static bool isRadarSoLoad_; diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index 0c88ab78f8b06ff2397f138f7274017525bc8157..e4d102b1f30d6f56ff838ff95dc56fa625782333 100644 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -1623,12 +1623,16 @@ int32_t DeviceManagerService::BindTarget(const std::string &pkgName, const PeerT LOGE("The caller does not have permission to call"); return ERR_DM_NO_PERMISSION; } + LOGI("BindTarget unstardard begin."); if (!IsDMServiceAdapterResidentLoad()) { - LOGE("BindTarget failed, adapter instance not init or init failed."); + LOGE("BindTarget failed, instance not init or init failed."); return ERR_DM_UNSUPPORTED_METHOD; } - LOGI("BindTarget unstardard begin."); - return dmServiceImplExtResident_->BindTargetExt(pkgName, targetId, bindParam); + std::map &extBindParam = + const_cast &>(bindParam) + ProcessBackGroundUserTrustDevice(targetId.deviceId, extBindParam); + CHECK_NULL_RETURN(dmServiceImplExtResident_, ERR_DM_POINT_NULL); + return dmServiceImplExtResident_->BindTargetExt(pkgName, targetId, extBindParam); } int32_t DeviceManagerService::UnbindTarget(const std::string &pkgName, const PeerTargetId &targetId, @@ -4267,5 +4271,67 @@ bool DeviceManagerService::CheckSinkIsSameAccount(const DmAccessCaller &caller, } return dmServiceImpl_->CheckSinkIsSameAccount(caller, srcUdid, callee, sinkUdid); } + +void DeviceManagerService::ProcessBackGroundUserTrustDevice(const std::string &udidHash, + std::map &bindParam) +{ + LOGI("start udidhash %{public}s.", GetAnonyString(udidHash).c_str()); + if (udidHash.empty()) { + LOGE("udidHash is empty"); + return; + } + std::string udid; + SoftbusCache::GetInstance().GetUdidByUdidHash(udidHash, udid); + //get ostype by udid + int32_t ostype = DM_HO_OSTYPE; + if (GetOsTypeByUdid(udid, ostype) != DM_OK) { + LOGE("get ostype by udid failed."); + return; + } + bindParam["peerUdid"] = udid; + bindParam["peerOsType"] = std::to_string(ostype); + if (ostype == DM_OH_OSTYPE) { + DeleteExtBackGroundUserTrustDev(udid); + } +} + +int32_t DeviceManagerService::GetOsTypeByUdid(const std::string &udid, int32_t &ostype) +{ + if (udid.empty()) { + LOGE("udid is empty"); + return ERR_DM_FAILED; + } + std::string osTypeValue; + KVAdapterManager::GetInstance().GetOstypeData(udid, osTypeValue); + LOGI("osTypeValue %{public}s.", osTypeValue.c_str()); + JsonObject jsonObject(osTypeValue); + if (jsonObject.IsDiscarded() || !IsInt32(jsonObject, DM_OSTYPE)) { + LOGE("osTypeValue invalid."); + return ERR_DM_FAILED; + } + ostype = jsonObject[DM_OSTYPE].Get(); + return DM_OK; +} + +void DeviceManagerService::DeleteExtBackGroundUserTrustDev(const std::string &udid) +{ + LOGI("start udid %{public}s.", GetAnonyString(udid).c_str()); + if (udid.empty()) { + LOGE("udid is empty"); + return ERR_DM_FAILED; + } + //delete trust relationship created by dm + if (!IsDMServiceImplReady()) { + LOGE("GetAccessUdidByNetworkId failed, instance not init or init failed."); + return false; + } + std::vector backGroundUserIds; + MultipleUserConnector::GetInstance().GetBackgroundUserIds(backGroundUserIds); + if (backGroundUserIds.empty()) { + LOGE("backGroundUserIds is empty"); + return; + } + dmServiceImpl_->DeleteExtBackGroundUserTrustDev(udid, backGroundUserIds); +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/service/src/softbus/softbus_listener.cpp b/services/service/src/softbus/softbus_listener.cpp index f3d2faceff7780cba9d420310736399d305f0f61..4735f283d76443f16c0f1b23a872b16e1a7ba52c 100644 --- a/services/service/src/softbus/softbus_listener.cpp +++ b/services/service/src/softbus/softbus_listener.cpp @@ -34,6 +34,7 @@ #include "multiple_user_connector.h" #endif #include "ipc_skeleton.h" +#include "kv_adapter_manager.h" #include "parameter.h" #include "system_ability_definition.h" @@ -285,9 +286,9 @@ void SoftbusListener::OnSoftbusDeviceOnline(NodeBasicInfo *info) } deviceOnLine.detach(); #endif + std::string peerUdid; + GetUdidByNetworkId(info->networkId, peerUdid); { - std::string peerUdid; - GetUdidByNetworkId(info->networkId, peerUdid); struct RadarInfo radarInfo = { .funcName = "OnSoftbusDeviceOnline", .stageRes = static_cast(StageRes::STAGE_SUCC), @@ -302,6 +303,9 @@ void SoftbusListener::OnSoftbusDeviceOnline(NodeBasicInfo *info) } } } + std::string osTypeStr = ""; + ConvertOsTypeToJson(info->osType, osTypeStr); + KVAdapterManager::GetInstance().PutOstypeData(peerUdid, osTypeStr); } void SoftbusListener::OnSoftbusDeviceOffline(NodeBasicInfo *info) @@ -333,9 +337,9 @@ void SoftbusListener::OnSoftbusDeviceOffline(NodeBasicInfo *info) } deviceOffLine.detach(); #endif + std::string peerUdid; + GetUdidByNetworkId(info->networkId, peerUdid); { - std::string peerUdid; - GetUdidByNetworkId(info->networkId, peerUdid); struct RadarInfo radarInfo = { .funcName = "OnSoftbusDeviceOffline", .stageRes = static_cast(StageRes::STAGE_SUCC), @@ -349,6 +353,7 @@ void SoftbusListener::OnSoftbusDeviceOffline(NodeBasicInfo *info) } } } + KVAdapterManager::GetInstance().DeleteOstypeData(peerUdid); } void SoftbusListener::UpdateDeviceName(NodeBasicInfo *info) @@ -1430,5 +1435,13 @@ void SoftbusListener::GetActionId(const std::string &deviceId, int32_t &actionId } actionId = discoveredDeviceActionIdMap.find(deviceId)->second; } + +void SoftbusListener::ConvertOsTypeToJson(int32_t osType, std::string &osTypeStr) +{ + LOGI("ostype %{public}d.", osType); + JsonObject jsonObj; + jsonObj[DM_OSTYPE] = osType; + osTypeStr = SafetyDump(jsonObj); +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/utils/include/kvadapter/kv_adapter_manager.h b/utils/include/kvadapter/kv_adapter_manager.h index ccd6f74a4fd5a389320c8f51f679a03a30662df5..d4c5cc2531ec2fbba7ff5e20713dd6e97c0d7893 100644 --- a/utils/include/kvadapter/kv_adapter_manager.h +++ b/utils/include/kvadapter/kv_adapter_manager.h @@ -41,6 +41,9 @@ public: DM_EXPORT int32_t GetFreezeData(const std::string &key, std::string &value); DM_EXPORT int32_t PutFreezeData(const std::string &key, std::string &value); DM_EXPORT int32_t DeleteFreezeData(const std::string &key); + DM_EXPORT int32_t GetOstypeData(const std::string &key, std::string &value); + DM_EXPORT int32_t PutOstypeData(const std::string &key, std::string &value); + DM_EXPORT int32_t DeleteOstypeData(const std::string &key); private: KVAdapterManager() = default; diff --git a/utils/src/kvadapter/kv_adapter_manager.cpp b/utils/src/kvadapter/kv_adapter_manager.cpp index da4f504850a8144bb298f9daff0476fa13748749..b14799cc60fdd2f56303a5721282cc6df0fd6679 100644 --- a/utils/src/kvadapter/kv_adapter_manager.cpp +++ b/utils/src/kvadapter/kv_adapter_manager.cpp @@ -30,6 +30,8 @@ namespace { constexpr const char* DM_KV_STORE_PREFIX = "DM2_"; constexpr const char* DM_KV_STORE_FREEZE_PREFIX = "anti_ddos_local_"; constexpr const char* DB_KEY_DELIMITER = "###"; +constexpr const char* DM_OSTYPE_KEY = "ostype"; +constexpr const char* DM_UDID_KEY = "udid"; constexpr int64_t DM_KV_STORE_REFRESH_TIME = 24 * 60 * 60; // one day constexpr int64_t MAX_SUPPORTED_EXIST_TIME = 3 * 24 * 60 * 60; // 3days } @@ -182,5 +184,38 @@ DM_EXPORT int32_t KVAdapterManager::DeleteFreezeData(const std::string &key) } return DM_OK; } + +DM_EXPORT int32_t KVAdapterManager::GetOstypeData(const std::string &key, std::string &value) +{ + std::string dmKey = DM_OSTYPE_KEY + DM_UDID_KEY + key; + CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); + if (kvAdapter_->Get(dmKey, value) != DM_OK) { + LOGE("Get freeze data failed, dmKey: %{public}s", GetAnonyString(dmKey).c_str()); + return ERR_DM_FAILED; + } + return DM_OK; +} + +DM_EXPORT int32_t KVAdapterManager::PutOstypeData(const std::string &key, std::string &value) +{ + std::string dmKey = DM_OSTYPE_KEY + DM_UDID_KEY + key; + CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); + if (kvAdapter_->Put(dmKey, value) != DM_OK) { + LOGE("Insert freeze data failed, k:%{public}s, v:%{public}s", dmKey.c_str(), value.c_str()); + return ERR_DM_FAILED; + } + return DM_OK; +} + +DM_EXPORT int32_t KVAdapterManager::DeleteOstypeData(const std::string &key) +{ + std::string dmKey = DM_OSTYPE_KEY + DM_UDID_KEY + key; + CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); + if (kvAdapter_->Delete(dmKey) != DM_OK) { + LOGE("delete freeze data failed, dmKey: %{public}s", GetAnonyString(dmKey).c_str()); + return ERR_DM_FAILED; + } + return DM_OK; +} } // namespace DistributedHardware } // namespace OHOS