diff --git a/commondependency/src/deviceprofile_connector.cpp b/commondependency/src/deviceprofile_connector.cpp index 6d57f99bc7785a08d306bda9d9362f08727bad26..950276a9409b5d084f73bb3225de69778600b238 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -886,33 +886,99 @@ int32_t DeviceProfileConnector::IsSameAccount(const std::string &udid) return ERR_DM_FAILED; } +bool checkAccesserACL(AccessControlProfile& profile, const DmAccessCaller &caller, + const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) +{ + // the device is accesser + if (profile.GetAccesser().GetAccesserUserId() != 0 && + profile.GetAccesser().GetAccesserUserId() != -1 && + (profile.GetAccessee().GetAccesseeUserId() == 0 || profile.GetAccessee().GetAccesseeUserId() == -1)) { + // caller is accesser, callee is accessee + if (profile.GetAccesser().GetAccesserDeviceId() == srcUdid && + profile.GetAccesser().GetAccesserUserId() == caller.userId && + profile.GetAccessee().GetAccesseeDeviceId() == sinkUdid) { + LOGI("old version, the device is accesser, caller is accesser, callee is accessee"); + return true; + } + // caller is accessee, callee is accesser + if (profile.GetAccesser().GetAccesserDeviceId() == sinkUdid && + profile.GetAccesser().GetAccesserUserId() == callee.userId && + profile.GetAccessee().GetAccesseeDeviceId() == srcUdid) { + LOGI("old version, the device is accesser, caller is accessee, callee is accesser"); + return true; + } + } + return false; +} + +bool checkAccesseeACL(AccessControlProfile& profile, const DmAccessCaller &caller, + const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) +{ + // the device is accessee + if ((profile.GetAccesser().GetAccesserUserId() == 0 || profile.GetAccesser().GetAccesserUserId() == -1) && + profile.GetAccessee().GetAccesseeUserId() != 0 && + profile.GetAccessee().GetAccesseeUserId() != -1) { + // caller is accesser, callee is accessee + if (profile.GetAccesser().GetAccesserDeviceId() == srcUdid && + profile.GetAccessee().GetAccesseeDeviceId() == sinkUdid && + profile.GetAccessee().GetAccesseeUserId() == callee.userId) { + LOGI("old version, the device is accessee, caller is accesser, callee is accessee"); + return true; + } + // caller is accessee, callee is accesser + if (profile.GetAccesser().GetAccesserDeviceId() == sinkUdid && + profile.GetAccessee().GetAccesseeDeviceId() == srcUdid && + profile.GetAccessee().GetAccesseeUserId() == caller.userId) { + LOGI("old version, the device is accessee, caller is accessee, callee is accesser"); + return true; + } + } + return false; +} + +bool checkACLInOldVersion(AccessControlProfile& profile, const DmAccessCaller &caller, + const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) +{ + // cannot consider multi-user for old version + if (checkAccesserACL(profile, caller, srcUdid, callee, sinkUdid) || + checkAccesseeACL(profile, caller, srcUdid, callee, sinkUdid)) { + return true; + } + return false; +} + +bool checkACLInNewVersion(AccessControlProfile& profile, const DmAccessCaller &caller, + const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) +{ + // consider multi-user for new version + // caller is accesser, callee is accessee + if (profile.GetAccesser().GetAccesserDeviceId() == srcUdid && + profile.GetAccesser().GetAccesserUserId() == caller.userId && + profile.GetAccessee().GetAccesseeDeviceId() == sinkUdid && + profile.GetAccessee().GetAccesseeUserId() == callee.userId) { + LOGI("new version, caller is accesser, callee is accessee"); + return true; + } + // caller is accessee, callee is accesser + if (profile.GetAccesser().GetAccesserDeviceId() == sinkUdid && + profile.GetAccesser().GetAccesserUserId() == callee.userId && + profile.GetAccessee().GetAccesseeDeviceId() == srcUdid && + profile.GetAccessee().GetAccesseeUserId() == caller.userId) { + LOGI("new version, caller is accessee, callee is accesser"); + return true; + } + return false; +} + std::vector GetACLByDeviceIdAndUserId(std::vector profiles, const DmAccessCaller &caller, const std::string &srcUdid, const DmAccessCallee &callee, const std::string &sinkUdid) { std::vector profilesFilter; - for (auto &item : profiles) { - if (item.GetAccesser().GetAccesserUserId() == caller.userId && - item.GetAccesser().GetAccesserDeviceId() == srcUdid && - item.GetAccessee().GetAccesseeDeviceId() == sinkUdid) { - if (callee.userId != 0 && callee.userId == item.GetAccessee().GetAccesseeUserId()) { - profilesFilter.push_back(item); - continue; - } else if (callee.userId == 0 || item.GetAccessee().GetAccesseeUserId() == -1) { - profilesFilter.push_back(item); - continue; - } - } - if ((item.GetAccessee().GetAccesseeUserId() == caller.userId || - item.GetAccessee().GetAccesseeUserId() == -1) && - item.GetAccessee().GetAccesseeDeviceId() == srcUdid && - item.GetAccesser().GetAccesserDeviceId() == sinkUdid) { - if (callee.userId != 0 && callee.userId == item.GetAccesser().GetAccesserUserId()) { - profilesFilter.push_back(item); - continue; - } else if (callee.userId == 0 || item.GetAccesser().GetAccesserUserId() == -1) { - profilesFilter.push_back(item); - continue; - } + for (int32_t i = 0; i < profiles.size(); i++) { + AccessControlProfile profile = profiles[i]; + if (checkACLInOldVersion(profile, caller, srcUdid, callee, sinkUdid) || + checkACLInNewVersion(profile, caller, srcUdid, callee, sinkUdid)) { + profilesFilter.push_back(profile); } } return profilesFilter;