179a732c7Sopenharmony_ci/* 279a732c7Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 379a732c7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 479a732c7Sopenharmony_ci * you may not use this file except in compliance with the License. 579a732c7Sopenharmony_ci * You may obtain a copy of the License at 679a732c7Sopenharmony_ci * 779a732c7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 879a732c7Sopenharmony_ci * 979a732c7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1079a732c7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1179a732c7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1279a732c7Sopenharmony_ci * See the License for the specific language governing permissions and 1379a732c7Sopenharmony_ci * limitations under the License. 1479a732c7Sopenharmony_ci */ 1579a732c7Sopenharmony_ci 1679a732c7Sopenharmony_ci#include "deviceprofile_connector.h" 1779a732c7Sopenharmony_ci#include "dm_anonymous.h" 1879a732c7Sopenharmony_ci#include "dm_constants.h" 1979a732c7Sopenharmony_ci#include "dm_crypto.h" 2079a732c7Sopenharmony_ci#include "dm_log.h" 2179a732c7Sopenharmony_ci#include "multiple_user_connector.h" 2279a732c7Sopenharmony_ci#include "distributed_device_profile_client.h" 2379a732c7Sopenharmony_ci 2479a732c7Sopenharmony_ciusing namespace OHOS::DistributedDeviceProfile; 2579a732c7Sopenharmony_ci 2679a732c7Sopenharmony_cinamespace OHOS { 2779a732c7Sopenharmony_cinamespace DistributedHardware { 2879a732c7Sopenharmony_ciDM_IMPLEMENT_SINGLE_INSTANCE(DeviceProfileConnector); 2979a732c7Sopenharmony_cistd::vector<AccessControlProfile> DeviceProfileConnector::GetAccessControlProfile() 3079a732c7Sopenharmony_ci{ 3179a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles; 3279a732c7Sopenharmony_ci std::map<std::string, std::string> queryParams; 3379a732c7Sopenharmony_ci int32_t userId = MultipleUserConnector::GetCurrentAccountUserID(); 3479a732c7Sopenharmony_ci queryParams[USERID] = std::to_string(userId); 3579a732c7Sopenharmony_ci if (DistributedDeviceProfileClient::GetInstance().GetAccessControlProfile(queryParams, profiles) != DM_OK) { 3679a732c7Sopenharmony_ci LOGE("DP GetAccessControlProfile failed."); 3779a732c7Sopenharmony_ci } 3879a732c7Sopenharmony_ci return profiles; 3979a732c7Sopenharmony_ci} 4079a732c7Sopenharmony_ci 4179a732c7Sopenharmony_cistd::vector<AccessControlProfile> DeviceProfileConnector::GetAccessControlProfileByUserId(int32_t userId) 4279a732c7Sopenharmony_ci{ 4379a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles; 4479a732c7Sopenharmony_ci std::map<std::string, std::string> queryParams; 4579a732c7Sopenharmony_ci queryParams[USERID] = std::to_string(userId); 4679a732c7Sopenharmony_ci if (DistributedDeviceProfileClient::GetInstance().GetAccessControlProfile(queryParams, profiles) != DM_OK) { 4779a732c7Sopenharmony_ci LOGE("DP GetAccessControlProfileByUserId failed."); 4879a732c7Sopenharmony_ci } 4979a732c7Sopenharmony_ci return profiles; 5079a732c7Sopenharmony_ci} 5179a732c7Sopenharmony_ci 5279a732c7Sopenharmony_cistd::unordered_map<std::string, DmAuthForm> DeviceProfileConnector::GetAppTrustDeviceList(const std::string &pkgName, 5379a732c7Sopenharmony_ci const std::string &deviceId) 5479a732c7Sopenharmony_ci{ 5579a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 5679a732c7Sopenharmony_ci std::unordered_map<std::string, DmAuthForm> deviceIdMap; 5779a732c7Sopenharmony_ci for (auto &item : profiles) { 5879a732c7Sopenharmony_ci std::string trustDeviceId = item.GetTrustDeviceId(); 5979a732c7Sopenharmony_ci if (trustDeviceId == deviceId || item.GetStatus() != ACTIVE) { 6079a732c7Sopenharmony_ci continue; 6179a732c7Sopenharmony_ci } 6279a732c7Sopenharmony_ci DmDiscoveryInfo discoveryInfo = {pkgName, deviceId}; 6379a732c7Sopenharmony_ci int32_t bindType = HandleDmAuthForm(item, discoveryInfo); 6479a732c7Sopenharmony_ci LOGI("The udid %{public}s in ACL authForm is %{public}d.", GetAnonyString(trustDeviceId).c_str(), bindType); 6579a732c7Sopenharmony_ci if (bindType == DmAuthForm::INVALID_TYPE) { 6679a732c7Sopenharmony_ci continue; 6779a732c7Sopenharmony_ci } 6879a732c7Sopenharmony_ci if (deviceIdMap.find(trustDeviceId) == deviceIdMap.end()) { 6979a732c7Sopenharmony_ci deviceIdMap[trustDeviceId] = static_cast<DmAuthForm>(bindType); 7079a732c7Sopenharmony_ci continue; 7179a732c7Sopenharmony_ci } 7279a732c7Sopenharmony_ci DmAuthForm authForm = deviceIdMap.at(trustDeviceId); 7379a732c7Sopenharmony_ci if (bindType == authForm) { 7479a732c7Sopenharmony_ci continue; 7579a732c7Sopenharmony_ci } 7679a732c7Sopenharmony_ci if (bindType == DmAuthForm::IDENTICAL_ACCOUNT) { 7779a732c7Sopenharmony_ci deviceIdMap[trustDeviceId] = DmAuthForm::IDENTICAL_ACCOUNT; 7879a732c7Sopenharmony_ci continue; 7979a732c7Sopenharmony_ci } 8079a732c7Sopenharmony_ci if (bindType == DmAuthForm::PEER_TO_PEER && authForm == DmAuthForm::ACROSS_ACCOUNT) { 8179a732c7Sopenharmony_ci deviceIdMap[trustDeviceId] = DmAuthForm::PEER_TO_PEER; 8279a732c7Sopenharmony_ci continue; 8379a732c7Sopenharmony_ci } 8479a732c7Sopenharmony_ci } 8579a732c7Sopenharmony_ci return deviceIdMap; 8679a732c7Sopenharmony_ci} 8779a732c7Sopenharmony_ci 8879a732c7Sopenharmony_ciint32_t DeviceProfileConnector::GetDeviceAclParam(DmDiscoveryInfo discoveryInfo, bool &isOnline, int32_t &authForm) 8979a732c7Sopenharmony_ci{ 9079a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 9179a732c7Sopenharmony_ci if (profiles.size() == 0) { 9279a732c7Sopenharmony_ci return DM_OK; 9379a732c7Sopenharmony_ci } 9479a732c7Sopenharmony_ci std::vector<int32_t> bindTypes; 9579a732c7Sopenharmony_ci for (auto &item : profiles) { 9679a732c7Sopenharmony_ci char deviceIdHash[DM_MAX_DEVICE_ID_LEN] = {0}; 9779a732c7Sopenharmony_ci if (Crypto::GetUdidHash(item.GetTrustDeviceId(), reinterpret_cast<uint8_t *>(deviceIdHash)) != DM_OK) { 9879a732c7Sopenharmony_ci LOGE("get deviceIdHash by deviceId: %{public}s failed.", GetAnonyString(deviceIdHash).c_str()); 9979a732c7Sopenharmony_ci return ERR_DM_FAILED; 10079a732c7Sopenharmony_ci } 10179a732c7Sopenharmony_ci if (static_cast<std::string>(deviceIdHash) != discoveryInfo.remoteDeviceIdHash || item.GetStatus() != ACTIVE) { 10279a732c7Sopenharmony_ci continue; 10379a732c7Sopenharmony_ci } 10479a732c7Sopenharmony_ci int32_t bindType = HandleDmAuthForm(item, discoveryInfo); 10579a732c7Sopenharmony_ci if (bindType == DmAuthForm::INVALID_TYPE) { 10679a732c7Sopenharmony_ci continue; 10779a732c7Sopenharmony_ci } 10879a732c7Sopenharmony_ci bindTypes.push_back(bindType); 10979a732c7Sopenharmony_ci } 11079a732c7Sopenharmony_ci if (std::count(bindTypes.begin(), bindTypes.end(), DmAuthForm::IDENTICAL_ACCOUNT) > 0) { 11179a732c7Sopenharmony_ci isOnline = true; 11279a732c7Sopenharmony_ci authForm = DmAuthForm::IDENTICAL_ACCOUNT; 11379a732c7Sopenharmony_ci LOGI("The found device is identical account device bind type."); 11479a732c7Sopenharmony_ci return DM_OK; 11579a732c7Sopenharmony_ci } 11679a732c7Sopenharmony_ci if (std::count(bindTypes.begin(), bindTypes.end(), DmAuthForm::PEER_TO_PEER) > 0) { 11779a732c7Sopenharmony_ci isOnline = true; 11879a732c7Sopenharmony_ci authForm = DmAuthForm::PEER_TO_PEER; 11979a732c7Sopenharmony_ci LOGI("The found device is peer-to-peer device bind-level."); 12079a732c7Sopenharmony_ci return DM_OK; 12179a732c7Sopenharmony_ci } 12279a732c7Sopenharmony_ci if (std::count(bindTypes.begin(), bindTypes.end(), DmAuthForm::ACROSS_ACCOUNT) > 0) { 12379a732c7Sopenharmony_ci isOnline = true; 12479a732c7Sopenharmony_ci authForm = DmAuthForm::ACROSS_ACCOUNT; 12579a732c7Sopenharmony_ci LOGI("The found device is across-account device bind-level."); 12679a732c7Sopenharmony_ci return DM_OK; 12779a732c7Sopenharmony_ci } 12879a732c7Sopenharmony_ci authForm = DmAuthForm::INVALID_TYPE; 12979a732c7Sopenharmony_ci return DM_OK; 13079a732c7Sopenharmony_ci} 13179a732c7Sopenharmony_ci 13279a732c7Sopenharmony_ciint32_t DeviceProfileConnector::CheckAuthForm(DmAuthForm form, AccessControlProfile profiles, 13379a732c7Sopenharmony_ci DmDiscoveryInfo discoveryInfo) 13479a732c7Sopenharmony_ci{ 13579a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE || (profiles.GetBindLevel() == APP && discoveryInfo.pkgname == "")) { 13679a732c7Sopenharmony_ci return form; 13779a732c7Sopenharmony_ci } 13879a732c7Sopenharmony_ci if (profiles.GetBindLevel() == APP) { 13979a732c7Sopenharmony_ci if (discoveryInfo.pkgname == profiles.GetAccesser().GetAccesserBundleName() && 14079a732c7Sopenharmony_ci discoveryInfo.localDeviceId == profiles.GetAccesser().GetAccesserDeviceId()) { 14179a732c7Sopenharmony_ci return form; 14279a732c7Sopenharmony_ci } 14379a732c7Sopenharmony_ci if (discoveryInfo.pkgname == profiles.GetAccessee().GetAccesseeBundleName() && 14479a732c7Sopenharmony_ci discoveryInfo.localDeviceId == profiles.GetAccessee().GetAccesseeDeviceId()) { 14579a732c7Sopenharmony_ci return form; 14679a732c7Sopenharmony_ci } 14779a732c7Sopenharmony_ci } 14879a732c7Sopenharmony_ci return DmAuthForm::INVALID_TYPE; 14979a732c7Sopenharmony_ci} 15079a732c7Sopenharmony_ci 15179a732c7Sopenharmony_ciint32_t DeviceProfileConnector::HandleDmAuthForm(AccessControlProfile profiles, DmDiscoveryInfo discoveryInfo) 15279a732c7Sopenharmony_ci{ 15379a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_IDENTICAL_ACCOUNT) { 15479a732c7Sopenharmony_ci return DmAuthForm::IDENTICAL_ACCOUNT; 15579a732c7Sopenharmony_ci } 15679a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_POINT_TO_POINT) { 15779a732c7Sopenharmony_ci return CheckAuthForm(DmAuthForm::PEER_TO_PEER, profiles, discoveryInfo); 15879a732c7Sopenharmony_ci } 15979a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_ACROSS_ACCOUNT) { 16079a732c7Sopenharmony_ci return CheckAuthForm(DmAuthForm::ACROSS_ACCOUNT, profiles, discoveryInfo); 16179a732c7Sopenharmony_ci } 16279a732c7Sopenharmony_ci return DmAuthForm::INVALID_TYPE; 16379a732c7Sopenharmony_ci} 16479a732c7Sopenharmony_ci 16579a732c7Sopenharmony_ciuint32_t DeviceProfileConnector::CheckBindType(std::string trustDeviceId, std::string requestDeviceId) 16679a732c7Sopenharmony_ci{ 16779a732c7Sopenharmony_ci LOGI("Start."); 16879a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 16979a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 17079a732c7Sopenharmony_ci uint32_t highestPriority = INVALIED_TYPE; 17179a732c7Sopenharmony_ci for (auto &item : profiles) { 17279a732c7Sopenharmony_ci if (trustDeviceId != item.GetTrustDeviceId() || item.GetStatus() != ACTIVE) { 17379a732c7Sopenharmony_ci continue; 17479a732c7Sopenharmony_ci } 17579a732c7Sopenharmony_ci uint32_t priority = static_cast<uint32_t>(GetAuthForm(item, trustDeviceId, requestDeviceId)); 17679a732c7Sopenharmony_ci if (priority > highestPriority) { 17779a732c7Sopenharmony_ci highestPriority = priority; 17879a732c7Sopenharmony_ci } 17979a732c7Sopenharmony_ci } 18079a732c7Sopenharmony_ci return highestPriority; 18179a732c7Sopenharmony_ci} 18279a732c7Sopenharmony_ci 18379a732c7Sopenharmony_ciint32_t DeviceProfileConnector::GetAuthForm(DistributedDeviceProfile::AccessControlProfile profiles, 18479a732c7Sopenharmony_ci const std::string &trustDev, const std::string &reqDev) 18579a732c7Sopenharmony_ci{ 18679a732c7Sopenharmony_ci LOGI("BindType %{public}d, bindLevel %{public}d", 18779a732c7Sopenharmony_ci profiles.GetBindType(), profiles.GetBindLevel()); 18879a732c7Sopenharmony_ci uint32_t priority = INVALIED_TYPE; 18979a732c7Sopenharmony_ci uint32_t bindType = profiles.GetBindType(); 19079a732c7Sopenharmony_ci switch (bindType) { 19179a732c7Sopenharmony_ci case DM_IDENTICAL_ACCOUNT: 19279a732c7Sopenharmony_ci priority = IDENTICAL_ACCOUNT_TYPE; 19379a732c7Sopenharmony_ci break; 19479a732c7Sopenharmony_ci case DM_POINT_TO_POINT: 19579a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 19679a732c7Sopenharmony_ci priority = DEVICE_PEER_TO_PEER_TYPE; 19779a732c7Sopenharmony_ci } else if (profiles.GetBindLevel() == APP && profiles.GetAccesser().GetAccesserDeviceId() == reqDev && 19879a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == trustDev) { 19979a732c7Sopenharmony_ci priority = APP_PEER_TO_PEER_TYPE; 20079a732c7Sopenharmony_ci } else if (profiles.GetBindLevel() == APP && profiles.GetAccessee().GetAccesseeDeviceId() == reqDev && 20179a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == trustDev) { 20279a732c7Sopenharmony_ci priority = APP_PEER_TO_PEER_TYPE; 20379a732c7Sopenharmony_ci } 20479a732c7Sopenharmony_ci break; 20579a732c7Sopenharmony_ci case DM_ACROSS_ACCOUNT: 20679a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 20779a732c7Sopenharmony_ci priority = DEVICE_ACROSS_ACCOUNT_TYPE; 20879a732c7Sopenharmony_ci } else if (profiles.GetBindLevel() == APP && profiles.GetAccesser().GetAccesserDeviceId() == reqDev && 20979a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == trustDev) { 21079a732c7Sopenharmony_ci priority = APP_ACROSS_ACCOUNT_TYPE; 21179a732c7Sopenharmony_ci } else if (profiles.GetBindLevel() == APP && profiles.GetAccessee().GetAccesseeDeviceId() == reqDev && 21279a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == trustDev) { 21379a732c7Sopenharmony_ci priority = APP_ACROSS_ACCOUNT_TYPE; 21479a732c7Sopenharmony_ci } 21579a732c7Sopenharmony_ci break; 21679a732c7Sopenharmony_ci default: 21779a732c7Sopenharmony_ci LOGE("unknown bind type %{public}d.", bindType); 21879a732c7Sopenharmony_ci break; 21979a732c7Sopenharmony_ci } 22079a732c7Sopenharmony_ci return priority; 22179a732c7Sopenharmony_ci} 22279a732c7Sopenharmony_ci 22379a732c7Sopenharmony_cistd::vector<int32_t> DeviceProfileConnector::GetBindTypeByPkgName(std::string pkgName, std::string requestDeviceId, 22479a732c7Sopenharmony_ci std::string trustUdid) 22579a732c7Sopenharmony_ci{ 22679a732c7Sopenharmony_ci LOGI("Start."); 22779a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 22879a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 22979a732c7Sopenharmony_ci std::vector<int32_t> bindTypeVec; 23079a732c7Sopenharmony_ci for (auto &item : profiles) { 23179a732c7Sopenharmony_ci if (trustUdid != item.GetTrustDeviceId() || item.GetStatus() != ACTIVE) { 23279a732c7Sopenharmony_ci continue; 23379a732c7Sopenharmony_ci } 23479a732c7Sopenharmony_ci GetParamBindTypeVec(item, pkgName, requestDeviceId, bindTypeVec); 23579a732c7Sopenharmony_ci } 23679a732c7Sopenharmony_ci return bindTypeVec; 23779a732c7Sopenharmony_ci} 23879a732c7Sopenharmony_ci 23979a732c7Sopenharmony_civoid DeviceProfileConnector::GetParamBindTypeVec(AccessControlProfile profiles, std::string pkgName, 24079a732c7Sopenharmony_ci std::string requestDeviceId, std::vector<int32_t> &bindTypeVec) 24179a732c7Sopenharmony_ci{ 24279a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_IDENTICAL_ACCOUNT) { 24379a732c7Sopenharmony_ci bindTypeVec.push_back(IDENTICAL_ACCOUNT_TYPE); 24479a732c7Sopenharmony_ci } 24579a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_POINT_TO_POINT) { 24679a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 24779a732c7Sopenharmony_ci bindTypeVec.push_back(DEVICE_PEER_TO_PEER_TYPE); 24879a732c7Sopenharmony_ci } 24979a732c7Sopenharmony_ci if (profiles.GetBindLevel() == APP) { 25079a732c7Sopenharmony_ci if (profiles.GetAccesser().GetAccesserBundleName() == pkgName && 25179a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == requestDeviceId) { 25279a732c7Sopenharmony_ci bindTypeVec.push_back(APP_PEER_TO_PEER_TYPE); 25379a732c7Sopenharmony_ci } 25479a732c7Sopenharmony_ci if ((profiles.GetAccessee().GetAccesseeBundleName() == pkgName && 25579a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == requestDeviceId)) { 25679a732c7Sopenharmony_ci bindTypeVec.push_back(APP_PEER_TO_PEER_TYPE); 25779a732c7Sopenharmony_ci } 25879a732c7Sopenharmony_ci } 25979a732c7Sopenharmony_ci } 26079a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_ACROSS_ACCOUNT) { 26179a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 26279a732c7Sopenharmony_ci bindTypeVec.push_back(DEVICE_ACROSS_ACCOUNT_TYPE); 26379a732c7Sopenharmony_ci } 26479a732c7Sopenharmony_ci if (profiles.GetBindLevel() == APP) { 26579a732c7Sopenharmony_ci if (profiles.GetAccesser().GetAccesserBundleName() == pkgName && 26679a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == requestDeviceId) { 26779a732c7Sopenharmony_ci bindTypeVec.push_back(APP_ACROSS_ACCOUNT_TYPE); 26879a732c7Sopenharmony_ci } 26979a732c7Sopenharmony_ci if ((profiles.GetAccessee().GetAccesseeBundleName() == pkgName && 27079a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == requestDeviceId)) { 27179a732c7Sopenharmony_ci bindTypeVec.push_back(APP_ACROSS_ACCOUNT_TYPE); 27279a732c7Sopenharmony_ci } 27379a732c7Sopenharmony_ci } 27479a732c7Sopenharmony_ci } 27579a732c7Sopenharmony_ci} 27679a732c7Sopenharmony_ci 27779a732c7Sopenharmony_cistd::vector<int32_t> DeviceProfileConnector::CompareBindType(std::vector<AccessControlProfile> profiles, 27879a732c7Sopenharmony_ci std::string pkgName, std::vector<int32_t> &sinkBindType, std::string localDeviceId, std::string targetDeviceId) 27979a732c7Sopenharmony_ci{ 28079a732c7Sopenharmony_ci std::vector<int32_t> bindTypeIndex; 28179a732c7Sopenharmony_ci for (uint32_t index = 0; index < profiles.size(); index++) { 28279a732c7Sopenharmony_ci if (profiles[index].GetTrustDeviceId() != targetDeviceId || profiles[index].GetStatus() != ACTIVE) { 28379a732c7Sopenharmony_ci continue; 28479a732c7Sopenharmony_ci } 28579a732c7Sopenharmony_ci DmDiscoveryInfo paramInfo = { 28679a732c7Sopenharmony_ci .pkgname = pkgName, 28779a732c7Sopenharmony_ci .localDeviceId = localDeviceId, 28879a732c7Sopenharmony_ci }; 28979a732c7Sopenharmony_ci ProcessBindType(profiles[index], paramInfo, sinkBindType, bindTypeIndex, index); 29079a732c7Sopenharmony_ci } 29179a732c7Sopenharmony_ci return bindTypeIndex; 29279a732c7Sopenharmony_ci} 29379a732c7Sopenharmony_ci 29479a732c7Sopenharmony_civoid DeviceProfileConnector::ProcessBindType(AccessControlProfile profiles, DmDiscoveryInfo paramInfo, 29579a732c7Sopenharmony_ci std::vector<int32_t> &sinkBindType, std::vector<int32_t> &bindTypeIndex, uint32_t index) 29679a732c7Sopenharmony_ci{ 29779a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_IDENTICAL_ACCOUNT) { 29879a732c7Sopenharmony_ci sinkBindType.push_back(IDENTICAL_ACCOUNT_TYPE); 29979a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 30079a732c7Sopenharmony_ci } 30179a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_POINT_TO_POINT) { 30279a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 30379a732c7Sopenharmony_ci sinkBindType.push_back(DEVICE_PEER_TO_PEER_TYPE); 30479a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 30579a732c7Sopenharmony_ci } 30679a732c7Sopenharmony_ci if (profiles.GetBindLevel() == APP) { 30779a732c7Sopenharmony_ci if (profiles.GetAccesser().GetAccesserBundleName() == paramInfo.pkgname && 30879a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == paramInfo.localDeviceId) { 30979a732c7Sopenharmony_ci sinkBindType.push_back(APP_PEER_TO_PEER_TYPE); 31079a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 31179a732c7Sopenharmony_ci } 31279a732c7Sopenharmony_ci if (profiles.GetAccessee().GetAccesseeBundleName() == paramInfo.pkgname && 31379a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == paramInfo.localDeviceId) { 31479a732c7Sopenharmony_ci sinkBindType.push_back(APP_PEER_TO_PEER_TYPE); 31579a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 31679a732c7Sopenharmony_ci } 31779a732c7Sopenharmony_ci } 31879a732c7Sopenharmony_ci } 31979a732c7Sopenharmony_ci if (profiles.GetBindType() == DM_ACROSS_ACCOUNT) { 32079a732c7Sopenharmony_ci if (profiles.GetBindLevel() == DEVICE) { 32179a732c7Sopenharmony_ci sinkBindType.push_back(DEVICE_ACROSS_ACCOUNT_TYPE); 32279a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 32379a732c7Sopenharmony_ci } 32479a732c7Sopenharmony_ci if (profiles.GetBindLevel() == APP) { 32579a732c7Sopenharmony_ci if (profiles.GetAccesser().GetAccesserBundleName() == paramInfo.pkgname && 32679a732c7Sopenharmony_ci profiles.GetAccesser().GetAccesserDeviceId() == paramInfo.localDeviceId) { 32779a732c7Sopenharmony_ci sinkBindType.push_back(APP_ACROSS_ACCOUNT_TYPE); 32879a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 32979a732c7Sopenharmony_ci } 33079a732c7Sopenharmony_ci if (profiles.GetAccessee().GetAccesseeBundleName() == paramInfo.pkgname && 33179a732c7Sopenharmony_ci profiles.GetAccessee().GetAccesseeDeviceId() == paramInfo.localDeviceId) { 33279a732c7Sopenharmony_ci sinkBindType.push_back(APP_ACROSS_ACCOUNT_TYPE); 33379a732c7Sopenharmony_ci bindTypeIndex.push_back(index); 33479a732c7Sopenharmony_ci } 33579a732c7Sopenharmony_ci } 33679a732c7Sopenharmony_ci } 33779a732c7Sopenharmony_ci} 33879a732c7Sopenharmony_ci 33979a732c7Sopenharmony_cistd::vector<int32_t> DeviceProfileConnector::SyncAclByBindType(std::string pkgName, std::vector<int32_t> bindTypeVec, 34079a732c7Sopenharmony_ci std::string localDeviceId, std::string targetDeviceId) 34179a732c7Sopenharmony_ci{ 34279a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 34379a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 34479a732c7Sopenharmony_ci std::vector<int32_t> sinkBindType; 34579a732c7Sopenharmony_ci std::vector<int32_t> bindType; 34679a732c7Sopenharmony_ci std::vector<int32_t> bindTypeIndex = 34779a732c7Sopenharmony_ci CompareBindType(profiles, pkgName, sinkBindType, localDeviceId, targetDeviceId); 34879a732c7Sopenharmony_ci for (uint32_t sinkIndex = 0; sinkIndex < sinkBindType.size(); sinkIndex++) { 34979a732c7Sopenharmony_ci bool deleteAclFlag = true; 35079a732c7Sopenharmony_ci for (uint32_t srcIndex = 0; srcIndex < bindTypeVec.size(); srcIndex++) { 35179a732c7Sopenharmony_ci if (sinkBindType[sinkIndex] == bindTypeVec[srcIndex]) { 35279a732c7Sopenharmony_ci deleteAclFlag = false; 35379a732c7Sopenharmony_ci bindType.push_back(bindTypeVec[sinkIndex]); 35479a732c7Sopenharmony_ci } 35579a732c7Sopenharmony_ci } 35679a732c7Sopenharmony_ci if (deleteAclFlag) { 35779a732c7Sopenharmony_ci int32_t deleteIndex = profiles[bindTypeIndex[sinkIndex]].GetAccessControlId(); 35879a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(deleteIndex); 35979a732c7Sopenharmony_ci } 36079a732c7Sopenharmony_ci } 36179a732c7Sopenharmony_ci return bindType; 36279a732c7Sopenharmony_ci} 36379a732c7Sopenharmony_ci 36479a732c7Sopenharmony_cistd::vector<std::string> DeviceProfileConnector::GetPkgNameFromAcl(std::string &localDeviceId, 36579a732c7Sopenharmony_ci std::string &targetDeviceId) 36679a732c7Sopenharmony_ci{ 36779a732c7Sopenharmony_ci LOGI("Start."); 36879a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 36979a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 37079a732c7Sopenharmony_ci std::vector<std::string> pkgNameVec; 37179a732c7Sopenharmony_ci for (auto &item : profiles) { 37279a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != targetDeviceId || item.GetStatus() != ACTIVE) { 37379a732c7Sopenharmony_ci continue; 37479a732c7Sopenharmony_ci } 37579a732c7Sopenharmony_ci if ((item.GetAccesser().GetAccesserDeviceId() == localDeviceId && 37679a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == targetDeviceId) || 37779a732c7Sopenharmony_ci (item.GetAccesser().GetAccesserDeviceId() == targetDeviceId && 37879a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localDeviceId)) { 37979a732c7Sopenharmony_ci pkgNameVec.push_back(item.GetAccesser().GetAccesserBundleName()); 38079a732c7Sopenharmony_ci } 38179a732c7Sopenharmony_ci } 38279a732c7Sopenharmony_ci return pkgNameVec; 38379a732c7Sopenharmony_ci} 38479a732c7Sopenharmony_ci 38579a732c7Sopenharmony_ciDmOfflineParam DeviceProfileConnector::GetOfflineParamFromAcl(std::string trustDeviceId, std::string requestDeviceId) 38679a732c7Sopenharmony_ci{ 38779a732c7Sopenharmony_ci LOGI("TrustDeviceId = %{public}s and requestDeviceId = %{public}s", 38879a732c7Sopenharmony_ci GetAnonyString(trustDeviceId).c_str(), GetAnonyString(requestDeviceId).c_str()); 38979a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 39079a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 39179a732c7Sopenharmony_ci DmOfflineParam offlineParam; 39279a732c7Sopenharmony_ci offlineParam.leftAclNumber = 0; 39379a732c7Sopenharmony_ci offlineParam.bindType = INVALIED_TYPE; 39479a732c7Sopenharmony_ci for (auto &item : profiles) { 39579a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != trustDeviceId || item.GetStatus() != ACTIVE) { 39679a732c7Sopenharmony_ci continue; 39779a732c7Sopenharmony_ci } 39879a732c7Sopenharmony_ci offlineParam.leftAclNumber++; 39979a732c7Sopenharmony_ci uint32_t priority = INVALIED_TYPE; 40079a732c7Sopenharmony_ci if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { 40179a732c7Sopenharmony_ci priority = IDENTICAL_ACCOUNT_TYPE; 40279a732c7Sopenharmony_ci } else if (item.GetBindLevel() == DEVICE && item.GetAuthenticationType() == ALLOW_AUTH_ALWAYS) { 40379a732c7Sopenharmony_ci priority = DEVICE_PEER_TO_PEER_TYPE; 40479a732c7Sopenharmony_ci } else if (item.GetBindLevel() == DEVICE && item.GetAuthenticationType() == ALLOW_AUTH_ONCE) { 40579a732c7Sopenharmony_ci priority = DEVICE_PEER_TO_PEER_TYPE; 40679a732c7Sopenharmony_ci offlineParam.pkgNameVec.push_back(item.GetAccesser().GetAccesserBundleName()); 40779a732c7Sopenharmony_ci } else if ((item.GetAccesser().GetAccesserDeviceId() == requestDeviceId && 40879a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == trustDeviceId) || 40979a732c7Sopenharmony_ci (item.GetAccesser().GetAccesserDeviceId() == trustDeviceId && 41079a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == requestDeviceId)) { 41179a732c7Sopenharmony_ci priority = APP_PEER_TO_PEER_TYPE; 41279a732c7Sopenharmony_ci offlineParam.pkgNameVec.push_back(item.GetAccesser().GetAccesserBundleName()); 41379a732c7Sopenharmony_ci } 41479a732c7Sopenharmony_ci if (priority > offlineParam.bindType) { 41579a732c7Sopenharmony_ci offlineParam.bindType = priority; 41679a732c7Sopenharmony_ci } 41779a732c7Sopenharmony_ci } 41879a732c7Sopenharmony_ci return offlineParam; 41979a732c7Sopenharmony_ci} 42079a732c7Sopenharmony_ci 42179a732c7Sopenharmony_ciint32_t DeviceProfileConnector::PutAccessControlList(DmAclInfo aclInfo, DmAccesser dmAccesser, DmAccessee dmAccessee) 42279a732c7Sopenharmony_ci{ 42379a732c7Sopenharmony_ci LOGI("Start."); 42479a732c7Sopenharmony_ci Accesser accesser; 42579a732c7Sopenharmony_ci accesser.SetAccesserDeviceId(dmAccesser.requestDeviceId); 42679a732c7Sopenharmony_ci accesser.SetAccesserUserId(dmAccesser.requestUserId); 42779a732c7Sopenharmony_ci accesser.SetAccesserAccountId(dmAccesser.requestAccountId); 42879a732c7Sopenharmony_ci accesser.SetAccesserTokenId(dmAccesser.requestTokenId); 42979a732c7Sopenharmony_ci accesser.SetAccesserBundleName(dmAccesser.requestBundleName); 43079a732c7Sopenharmony_ci Accessee accessee; 43179a732c7Sopenharmony_ci accessee.SetAccesseeDeviceId(dmAccessee.trustDeviceId); 43279a732c7Sopenharmony_ci accessee.SetAccesseeUserId(dmAccessee.trustUserId); 43379a732c7Sopenharmony_ci accessee.SetAccesseeAccountId(dmAccessee.trustAccountId); 43479a732c7Sopenharmony_ci accessee.SetAccesseeTokenId(dmAccessee.trustTokenId); 43579a732c7Sopenharmony_ci accessee.SetAccesseeBundleName(dmAccessee.trustBundleName); 43679a732c7Sopenharmony_ci AccessControlProfile profile; 43779a732c7Sopenharmony_ci profile.SetBindType(aclInfo.bindType); 43879a732c7Sopenharmony_ci profile.SetBindLevel(aclInfo.bindLevel); 43979a732c7Sopenharmony_ci profile.SetStatus(ACTIVE); 44079a732c7Sopenharmony_ci profile.SetTrustDeviceId(aclInfo.trustDeviceId); 44179a732c7Sopenharmony_ci profile.SetDeviceIdType((int32_t)DeviceIdType::UDID); 44279a732c7Sopenharmony_ci profile.SetDeviceIdHash(aclInfo.deviceIdHash); 44379a732c7Sopenharmony_ci profile.SetAuthenticationType(aclInfo.authenticationType); 44479a732c7Sopenharmony_ci profile.SetAccessee(accessee); 44579a732c7Sopenharmony_ci profile.SetAccesser(accesser); 44679a732c7Sopenharmony_ci int32_t ret = DistributedDeviceProfileClient::GetInstance().PutAccessControlProfile(profile); 44779a732c7Sopenharmony_ci if (ret != DM_OK) { 44879a732c7Sopenharmony_ci LOGE("PutAccessControlProfile failed."); 44979a732c7Sopenharmony_ci } 45079a732c7Sopenharmony_ci return ret; 45179a732c7Sopenharmony_ci} 45279a732c7Sopenharmony_ci 45379a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteAclForAccountLogOut(const std::string &localUdid, int32_t userId, 45479a732c7Sopenharmony_ci const std::string &remoteUdid) 45579a732c7Sopenharmony_ci{ 45679a732c7Sopenharmony_ci LOGI("localUdid %{public}s, userId %{public}d, remoteUdid %{public}s.", GetAnonyString(localUdid).c_str(), userId, 45779a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str()); 45879a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfileByUserId(userId); 45979a732c7Sopenharmony_ci for (const auto &item : profiles) { 46079a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == remoteUdid) { 46179a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 46279a732c7Sopenharmony_ci } 46379a732c7Sopenharmony_ci } 46479a732c7Sopenharmony_ci} 46579a732c7Sopenharmony_ci 46679a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteAclForUserRemoved(int32_t userId) 46779a732c7Sopenharmony_ci{ 46879a732c7Sopenharmony_ci LOGI("DeleteAclForUserRemoved userId %{public}d.", userId); 46979a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfileByUserId(userId); 47079a732c7Sopenharmony_ci for (const auto &item : profiles) { 47179a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserUserId() == userId || item.GetAccessee().GetAccesseeUserId() == userId) { 47279a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 47379a732c7Sopenharmony_ci } 47479a732c7Sopenharmony_ci } 47579a732c7Sopenharmony_ci} 47679a732c7Sopenharmony_ci 47779a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteAccessControlList(const std::string &udid) 47879a732c7Sopenharmony_ci{ 47979a732c7Sopenharmony_ci LOGI("Udid: %{public}s.", GetAnonyString(udid).c_str()); 48079a732c7Sopenharmony_ci if (udid.empty()) { 48179a732c7Sopenharmony_ci LOGE("DeleteAccessControlList udid is empty."); 48279a732c7Sopenharmony_ci return; 48379a732c7Sopenharmony_ci } 48479a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 48579a732c7Sopenharmony_ci LOGI("Size is %{public}zu", profiles.size()); 48679a732c7Sopenharmony_ci for (const auto &item : profiles) { 48779a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == udid) { 48879a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 48979a732c7Sopenharmony_ci } 49079a732c7Sopenharmony_ci } 49179a732c7Sopenharmony_ci} 49279a732c7Sopenharmony_ci 49379a732c7Sopenharmony_ciDmOfflineParam DeviceProfileConnector::DeleteAccessControlList(const std::string &pkgName, 49479a732c7Sopenharmony_ci const std::string &localDeviceId, const std::string &remoteDeviceId, int32_t bindLevel) 49579a732c7Sopenharmony_ci{ 49679a732c7Sopenharmony_ci LOGI("pkgName %{public}s, localDeviceId %{public}s, remoteDeviceId %{public}s, bindLevel %{public}d.", 49779a732c7Sopenharmony_ci pkgName.c_str(), GetAnonyString(localDeviceId).c_str(), GetAnonyString(remoteDeviceId).c_str(), bindLevel); 49879a732c7Sopenharmony_ci DmOfflineParam offlineParam; 49979a732c7Sopenharmony_ci offlineParam.bindType = INVALIED_TYPE; 50079a732c7Sopenharmony_ci if (static_cast<uint32_t>(bindLevel) > APP || static_cast<uint32_t>(bindLevel) < DEVICE) { 50179a732c7Sopenharmony_ci LOGE("Invalied bindlevel."); 50279a732c7Sopenharmony_ci return offlineParam; 50379a732c7Sopenharmony_ci } 50479a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 50579a732c7Sopenharmony_ci if (profiles.empty()) { 50679a732c7Sopenharmony_ci LOGE("Acl is empty."); 50779a732c7Sopenharmony_ci return offlineParam; 50879a732c7Sopenharmony_ci } 50979a732c7Sopenharmony_ci switch (bindLevel) { 51079a732c7Sopenharmony_ci case APP: 51179a732c7Sopenharmony_ci DeleteAppBindLevel(offlineParam, pkgName, profiles, localDeviceId, remoteDeviceId); 51279a732c7Sopenharmony_ci break; 51379a732c7Sopenharmony_ci case SERVICE: 51479a732c7Sopenharmony_ci DeleteServiceBindLevel(offlineParam, pkgName, profiles, localDeviceId, remoteDeviceId); 51579a732c7Sopenharmony_ci break; 51679a732c7Sopenharmony_ci case DEVICE: 51779a732c7Sopenharmony_ci DeleteDeviceBindLevel(offlineParam, profiles, localDeviceId, remoteDeviceId); 51879a732c7Sopenharmony_ci break; 51979a732c7Sopenharmony_ci default: 52079a732c7Sopenharmony_ci break; 52179a732c7Sopenharmony_ci } 52279a732c7Sopenharmony_ci return offlineParam; 52379a732c7Sopenharmony_ci} 52479a732c7Sopenharmony_ci 52579a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteAppBindLevel(DmOfflineParam &offlineParam, const std::string &pkgName, 52679a732c7Sopenharmony_ci const std::vector<AccessControlProfile> &profiles, const std::string &localUdid, const std::string &remoteUdid) 52779a732c7Sopenharmony_ci{ 52879a732c7Sopenharmony_ci int32_t bindNums = 0; 52979a732c7Sopenharmony_ci int32_t deleteNums = 0; 53079a732c7Sopenharmony_ci for (auto &item : profiles) { 53179a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid || item.GetBindType() == DM_IDENTICAL_ACCOUNT || 53279a732c7Sopenharmony_ci item.GetBindLevel() != APP) { 53379a732c7Sopenharmony_ci continue; 53479a732c7Sopenharmony_ci } 53579a732c7Sopenharmony_ci bindNums++; 53679a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserBundleName() == pkgName && 53779a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid && 53879a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == remoteUdid) { 53979a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 54079a732c7Sopenharmony_ci deleteNums++; 54179a732c7Sopenharmony_ci offlineParam.bindType = APP; 54279a732c7Sopenharmony_ci LOGI("Src delete acl pkgName %{public}s, bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", 54379a732c7Sopenharmony_ci pkgName.c_str(), item.GetBindType(), GetAnonyString(localUdid).c_str(), 54479a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str()); 54579a732c7Sopenharmony_ci continue; 54679a732c7Sopenharmony_ci } 54779a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeBundleName() == pkgName && 54879a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid && 54979a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == remoteUdid) { 55079a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 55179a732c7Sopenharmony_ci deleteNums++; 55279a732c7Sopenharmony_ci offlineParam.bindType = APP; 55379a732c7Sopenharmony_ci LOGI("Sink delete acl pkgName %{public}s, bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", 55479a732c7Sopenharmony_ci pkgName.c_str(), item.GetBindType(), GetAnonyString(localUdid).c_str(), 55579a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str()); 55679a732c7Sopenharmony_ci continue; 55779a732c7Sopenharmony_ci } 55879a732c7Sopenharmony_ci } 55979a732c7Sopenharmony_ci offlineParam.leftAclNumber = bindNums - deleteNums; 56079a732c7Sopenharmony_ci} 56179a732c7Sopenharmony_ci 56279a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteDeviceBindLevel(DmOfflineParam &offlineParam, 56379a732c7Sopenharmony_ci const std::vector<AccessControlProfile> &profiles, const std::string &localUdid, const std::string &remoteUdid) 56479a732c7Sopenharmony_ci{ 56579a732c7Sopenharmony_ci int32_t bindNums = 0; 56679a732c7Sopenharmony_ci int32_t deleteNums = 0; 56779a732c7Sopenharmony_ci for (auto &item : profiles) { 56879a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid || item.GetBindType() == DM_IDENTICAL_ACCOUNT) { 56979a732c7Sopenharmony_ci continue; 57079a732c7Sopenharmony_ci } 57179a732c7Sopenharmony_ci bindNums++; 57279a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserDeviceId() == localUdid && 57379a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == remoteUdid) { 57479a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 57579a732c7Sopenharmony_ci deleteNums++; 57679a732c7Sopenharmony_ci offlineParam.bindType = DEVICE; 57779a732c7Sopenharmony_ci LOGI("Src delete acl bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", item.GetBindType(), 57879a732c7Sopenharmony_ci GetAnonyString(localUdid).c_str(), GetAnonyString(remoteUdid).c_str()); 57979a732c7Sopenharmony_ci continue; 58079a732c7Sopenharmony_ci } 58179a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeDeviceId() == localUdid && 58279a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == remoteUdid) { 58379a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 58479a732c7Sopenharmony_ci deleteNums++; 58579a732c7Sopenharmony_ci offlineParam.bindType = DEVICE; 58679a732c7Sopenharmony_ci LOGI("Sink delete acl bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", item.GetBindType(), 58779a732c7Sopenharmony_ci GetAnonyString(localUdid).c_str(), GetAnonyString(remoteUdid).c_str()); 58879a732c7Sopenharmony_ci continue; 58979a732c7Sopenharmony_ci } 59079a732c7Sopenharmony_ci } 59179a732c7Sopenharmony_ci offlineParam.leftAclNumber = bindNums - deleteNums; 59279a732c7Sopenharmony_ci} 59379a732c7Sopenharmony_ci 59479a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteServiceBindLevel(DmOfflineParam &offlineParam, const std::string &pkgName, 59579a732c7Sopenharmony_ci const std::vector<AccessControlProfile> &profiles, const std::string &localUdid, const std::string &remoteUdid) 59679a732c7Sopenharmony_ci{ 59779a732c7Sopenharmony_ci int32_t bindNums = 0; 59879a732c7Sopenharmony_ci int32_t deleteNums = 0; 59979a732c7Sopenharmony_ci for (auto &item : profiles) { 60079a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid || item.GetBindType() == DM_IDENTICAL_ACCOUNT || 60179a732c7Sopenharmony_ci item.GetBindLevel() != SERVICE) { 60279a732c7Sopenharmony_ci continue; 60379a732c7Sopenharmony_ci } 60479a732c7Sopenharmony_ci bindNums++; 60579a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserBundleName() == pkgName && 60679a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid && 60779a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == remoteUdid) { 60879a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 60979a732c7Sopenharmony_ci deleteNums++; 61079a732c7Sopenharmony_ci offlineParam.bindType = SERVICE; 61179a732c7Sopenharmony_ci LOGI("Src delete acl pkgName %{public}s, bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", 61279a732c7Sopenharmony_ci pkgName.c_str(), item.GetBindType(), GetAnonyString(localUdid).c_str(), 61379a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str()); 61479a732c7Sopenharmony_ci continue; 61579a732c7Sopenharmony_ci } 61679a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeBundleName() == pkgName && 61779a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid && 61879a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == remoteUdid) { 61979a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 62079a732c7Sopenharmony_ci deleteNums++; 62179a732c7Sopenharmony_ci offlineParam.bindType = SERVICE; 62279a732c7Sopenharmony_ci LOGI("Sink delete acl pkgName %{public}s, bindType %{public}d, localUdid %{public}s, remoteUdid %{public}s", 62379a732c7Sopenharmony_ci pkgName.c_str(), item.GetBindType(), GetAnonyString(localUdid).c_str(), 62479a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str()); 62579a732c7Sopenharmony_ci continue; 62679a732c7Sopenharmony_ci } 62779a732c7Sopenharmony_ci } 62879a732c7Sopenharmony_ci offlineParam.leftAclNumber = bindNums - deleteNums; 62979a732c7Sopenharmony_ci} 63079a732c7Sopenharmony_ci 63179a732c7Sopenharmony_ciint32_t DeviceProfileConnector::UpdateAccessControlList(int32_t userId, std::string &oldAccountId, 63279a732c7Sopenharmony_ci std::string &newAccountId) 63379a732c7Sopenharmony_ci{ 63479a732c7Sopenharmony_ci LOGI("Start."); 63579a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 63679a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 63779a732c7Sopenharmony_ci for (auto &item : profiles) { 63879a732c7Sopenharmony_ci if ((item.GetAccesser().GetAccesserUserId() == userId && 63979a732c7Sopenharmony_ci item.GetAccesser().GetAccesserAccountId() == oldAccountId) || 64079a732c7Sopenharmony_ci (item.GetAccessee().GetAccesseeUserId() == userId && 64179a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeAccountId() == oldAccountId)) { 64279a732c7Sopenharmony_ci item.SetStatus(INACTIVE); 64379a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().UpdateAccessControlProfile(item); 64479a732c7Sopenharmony_ci } 64579a732c7Sopenharmony_ci if ((item.GetAccesser().GetAccesserUserId() == userId && 64679a732c7Sopenharmony_ci item.GetAccesser().GetAccesserAccountId() == newAccountId) || 64779a732c7Sopenharmony_ci (item.GetAccessee().GetAccesseeUserId() == userId && 64879a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeAccountId() == newAccountId)) { 64979a732c7Sopenharmony_ci item.SetStatus(ACTIVE); 65079a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().UpdateAccessControlProfile(item); 65179a732c7Sopenharmony_ci } 65279a732c7Sopenharmony_ci } 65379a732c7Sopenharmony_ci return DM_OK; 65479a732c7Sopenharmony_ci} 65579a732c7Sopenharmony_ci 65679a732c7Sopenharmony_cibool DeviceProfileConnector::CheckIdenticalAccount(int32_t userId, const std::string &accountId) 65779a732c7Sopenharmony_ci{ 65879a732c7Sopenharmony_ci LOGI("Start"); 65979a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles; 66079a732c7Sopenharmony_ci std::map<std::string, std::string> queryParams; 66179a732c7Sopenharmony_ci queryParams[USERID] = std::to_string(userId); 66279a732c7Sopenharmony_ci queryParams[ACCOUNTID] = accountId; 66379a732c7Sopenharmony_ci if (DistributedDeviceProfileClient::GetInstance().GetAccessControlProfile(queryParams, profiles) != DM_OK) { 66479a732c7Sopenharmony_ci LOGE("DP GetAccessControlProfile failed."); 66579a732c7Sopenharmony_ci } 66679a732c7Sopenharmony_ci for (auto &item : profiles) { 66779a732c7Sopenharmony_ci if (item.GetBindType() == DM_IDENTICAL_ACCOUNT && item.GetStatus() == ACTIVE) { 66879a732c7Sopenharmony_ci return true; 66979a732c7Sopenharmony_ci } 67079a732c7Sopenharmony_ci } 67179a732c7Sopenharmony_ci return false; 67279a732c7Sopenharmony_ci} 67379a732c7Sopenharmony_ci 67479a732c7Sopenharmony_cibool DeviceProfileConnector::CheckSrcDevIdInAclForDevBind(const std::string &pkgName, const std::string &deviceId) 67579a732c7Sopenharmony_ci{ 67679a732c7Sopenharmony_ci LOGI("Start"); 67779a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 67879a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 67979a732c7Sopenharmony_ci for (auto &item : profiles) { 68079a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == deviceId && item.GetStatus() == ACTIVE && 68179a732c7Sopenharmony_ci item.GetBindLevel() == DEVICE && (item.GetAccessee().GetAccesseeBundleName() == pkgName || 68279a732c7Sopenharmony_ci item.GetAccesser().GetAccesserBundleName() == "") && item.GetAccessee().GetAccesseeUserId() == 0 && 68379a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeAccountId() == "") { 68479a732c7Sopenharmony_ci return true; 68579a732c7Sopenharmony_ci } 68679a732c7Sopenharmony_ci } 68779a732c7Sopenharmony_ci return false; 68879a732c7Sopenharmony_ci} 68979a732c7Sopenharmony_ci 69079a732c7Sopenharmony_cibool DeviceProfileConnector::CheckSinkDevIdInAclForDevBind(const std::string &pkgName, const std::string &deviceId) 69179a732c7Sopenharmony_ci{ 69279a732c7Sopenharmony_ci LOGI("Start"); 69379a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 69479a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 69579a732c7Sopenharmony_ci for (auto &item : profiles) { 69679a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == deviceId && item.GetStatus() == ACTIVE && 69779a732c7Sopenharmony_ci item.GetBindLevel() == DEVICE && (item.GetAccesser().GetAccesserBundleName() == pkgName || 69879a732c7Sopenharmony_ci item.GetAccesser().GetAccesserBundleName() == "") && item.GetAccesser().GetAccesserUserId() == 0 && 69979a732c7Sopenharmony_ci item.GetAccesser().GetAccesserAccountId() == "") { 70079a732c7Sopenharmony_ci return true; 70179a732c7Sopenharmony_ci } 70279a732c7Sopenharmony_ci } 70379a732c7Sopenharmony_ci return false; 70479a732c7Sopenharmony_ci} 70579a732c7Sopenharmony_ci 70679a732c7Sopenharmony_cibool DeviceProfileConnector::CheckDevIdInAclForDevBind(const std::string &pkgName, const std::string &deviceId) 70779a732c7Sopenharmony_ci{ 70879a732c7Sopenharmony_ci return (CheckSinkDevIdInAclForDevBind(pkgName, deviceId) || CheckSrcDevIdInAclForDevBind(pkgName, deviceId)); 70979a732c7Sopenharmony_ci} 71079a732c7Sopenharmony_ci 71179a732c7Sopenharmony_ciuint32_t DeviceProfileConnector::DeleteTimeOutAcl(const std::string &deviceId) 71279a732c7Sopenharmony_ci{ 71379a732c7Sopenharmony_ci LOGI("Start"); 71479a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 71579a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 71679a732c7Sopenharmony_ci uint32_t res = 0; 71779a732c7Sopenharmony_ci for (auto &item : profiles) { 71879a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != deviceId || item.GetStatus() != ACTIVE) { 71979a732c7Sopenharmony_ci continue; 72079a732c7Sopenharmony_ci } 72179a732c7Sopenharmony_ci res++; 72279a732c7Sopenharmony_ci if (item.GetAuthenticationType() == ALLOW_AUTH_ONCE) { 72379a732c7Sopenharmony_ci res--; 72479a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 72579a732c7Sopenharmony_ci } 72679a732c7Sopenharmony_ci } 72779a732c7Sopenharmony_ci return res; 72879a732c7Sopenharmony_ci} 72979a732c7Sopenharmony_ci 73079a732c7Sopenharmony_ciint32_t DeviceProfileConnector::GetTrustNumber(const std::string &deviceId) 73179a732c7Sopenharmony_ci{ 73279a732c7Sopenharmony_ci LOGI("Start"); 73379a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 73479a732c7Sopenharmony_ci LOGI("AccessControlProfile size is %{public}zu", profiles.size()); 73579a732c7Sopenharmony_ci int32_t trustNumber = 0; 73679a732c7Sopenharmony_ci for (auto &item : profiles) { 73779a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == deviceId && item.GetStatus() == ACTIVE) { 73879a732c7Sopenharmony_ci trustNumber++; 73979a732c7Sopenharmony_ci } 74079a732c7Sopenharmony_ci } 74179a732c7Sopenharmony_ci return trustNumber; 74279a732c7Sopenharmony_ci} 74379a732c7Sopenharmony_ci 74479a732c7Sopenharmony_ciint32_t DeviceProfileConnector::IsSameAccount(const std::string &udid) 74579a732c7Sopenharmony_ci{ 74679a732c7Sopenharmony_ci LOGI("Start."); 74779a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 74879a732c7Sopenharmony_ci for (auto &item : profiles) { 74979a732c7Sopenharmony_ci if (item.GetTrustDeviceId() == udid && item.GetStatus() == ACTIVE) { 75079a732c7Sopenharmony_ci if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { // 同账号 75179a732c7Sopenharmony_ci LOGI("The udid %{public}s is identical bind.", GetAnonyString(udid).c_str()); 75279a732c7Sopenharmony_ci return DM_OK; 75379a732c7Sopenharmony_ci } 75479a732c7Sopenharmony_ci } 75579a732c7Sopenharmony_ci } 75679a732c7Sopenharmony_ci return ERR_DM_FAILED; 75779a732c7Sopenharmony_ci} 75879a732c7Sopenharmony_ci 75979a732c7Sopenharmony_ciint32_t DeviceProfileConnector::CheckAccessControl(const DmAccessCaller &caller, const std::string &srcUdid, 76079a732c7Sopenharmony_ci const DmAccessCallee &callee, const std::string &sinkUdid) 76179a732c7Sopenharmony_ci{ 76279a732c7Sopenharmony_ci LOGI("PkgName %{public}s, srcUdid %{public}s, sinkUdid %{public}s", 76379a732c7Sopenharmony_ci caller.pkgName.c_str(), GetAnonyString(srcUdid).c_str(), GetAnonyString(sinkUdid).c_str()); 76479a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 76579a732c7Sopenharmony_ci for (auto &item : profiles) { 76679a732c7Sopenharmony_ci if (item.GetStatus() != ACTIVE || (item.GetTrustDeviceId() != sinkUdid && 76779a732c7Sopenharmony_ci item.GetTrustDeviceId() != srcUdid)) { 76879a732c7Sopenharmony_ci continue; 76979a732c7Sopenharmony_ci } 77079a732c7Sopenharmony_ci if (SingleUserProcess(item, caller, callee)) { 77179a732c7Sopenharmony_ci return DM_OK; 77279a732c7Sopenharmony_ci } 77379a732c7Sopenharmony_ci } 77479a732c7Sopenharmony_ci return ERR_DM_FAILED; 77579a732c7Sopenharmony_ci} 77679a732c7Sopenharmony_ci 77779a732c7Sopenharmony_cibool DeviceProfileConnector::SingleUserProcess(const DistributedDeviceProfile::AccessControlProfile &profile, 77879a732c7Sopenharmony_ci const DmAccessCaller &caller, const DmAccessCallee &callee) 77979a732c7Sopenharmony_ci{ 78079a732c7Sopenharmony_ci LOGI("BindType %{public}d, bindLevel %{public}d.", 78179a732c7Sopenharmony_ci profile.GetBindType(), profile.GetBindLevel()); 78279a732c7Sopenharmony_ci uint32_t bindType = profile.GetBindType(); 78379a732c7Sopenharmony_ci bool ret = false; 78479a732c7Sopenharmony_ci switch (bindType) { 78579a732c7Sopenharmony_ci case DM_IDENTICAL_ACCOUNT: 78679a732c7Sopenharmony_ci ret = true; 78779a732c7Sopenharmony_ci break; 78879a732c7Sopenharmony_ci case DM_POINT_TO_POINT: 78979a732c7Sopenharmony_ci if (profile.GetBindLevel() == DEVICE || profile.GetBindLevel() == SERVICE) { 79079a732c7Sopenharmony_ci ret = true; 79179a732c7Sopenharmony_ci } else if (profile.GetBindLevel() == APP && 79279a732c7Sopenharmony_ci profile.GetAccesser().GetAccesserBundleName() == caller.pkgName) { 79379a732c7Sopenharmony_ci ret = true; 79479a732c7Sopenharmony_ci } 79579a732c7Sopenharmony_ci break; 79679a732c7Sopenharmony_ci case DM_ACROSS_ACCOUNT: 79779a732c7Sopenharmony_ci if (profile.GetBindLevel() == DEVICE || profile.GetBindLevel() == SERVICE) { 79879a732c7Sopenharmony_ci ret = true; 79979a732c7Sopenharmony_ci } else if (profile.GetBindLevel() == APP && 80079a732c7Sopenharmony_ci profile.GetAccesser().GetAccesserBundleName() == caller.pkgName) { 80179a732c7Sopenharmony_ci ret = true; 80279a732c7Sopenharmony_ci } 80379a732c7Sopenharmony_ci break; 80479a732c7Sopenharmony_ci default: 80579a732c7Sopenharmony_ci LOGE("unknown bind type %{public}d.", bindType); 80679a732c7Sopenharmony_ci break; 80779a732c7Sopenharmony_ci } 80879a732c7Sopenharmony_ci return ret; 80979a732c7Sopenharmony_ci} 81079a732c7Sopenharmony_ci 81179a732c7Sopenharmony_ciint32_t DeviceProfileConnector::CheckIsSameAccount(const DmAccessCaller &caller, const std::string &srcUdid, 81279a732c7Sopenharmony_ci const DmAccessCallee &callee, const std::string &sinkUdid) 81379a732c7Sopenharmony_ci{ 81479a732c7Sopenharmony_ci LOGI("DeviceProfileConnector::CheckIsSameAccount pkgName %{public}s, srcUdid %{public}s, sinkUdid %{public}s", 81579a732c7Sopenharmony_ci caller.pkgName.c_str(), GetAnonyString(srcUdid).c_str(), GetAnonyString(sinkUdid).c_str()); 81679a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 81779a732c7Sopenharmony_ci for (auto &item : profiles) { 81879a732c7Sopenharmony_ci if (item.GetStatus() != ACTIVE || (item.GetTrustDeviceId() != sinkUdid && 81979a732c7Sopenharmony_ci item.GetTrustDeviceId() != srcUdid)) { 82079a732c7Sopenharmony_ci continue; 82179a732c7Sopenharmony_ci } 82279a732c7Sopenharmony_ci if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { 82379a732c7Sopenharmony_ci LOGI("The udid %{public}s is identical bind.", GetAnonyString(item.GetTrustDeviceId()).c_str()); 82479a732c7Sopenharmony_ci return DM_OK; 82579a732c7Sopenharmony_ci } 82679a732c7Sopenharmony_ci } 82779a732c7Sopenharmony_ci return ERR_DM_FAILED; 82879a732c7Sopenharmony_ci} 82979a732c7Sopenharmony_ci 83079a732c7Sopenharmony_ciint32_t DeviceProfileConnector::GetBindLevel(const std::string &pkgName, const std::string &localUdid, 83179a732c7Sopenharmony_ci const std::string &udid, uint64_t &tokenId) 83279a732c7Sopenharmony_ci{ 83379a732c7Sopenharmony_ci LOGI("pkgName %{public}s, tokenId %{public}" PRId64", udid %{public}s.", pkgName.c_str(), 83479a732c7Sopenharmony_ci tokenId, GetAnonyString(udid).c_str()); 83579a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 83679a732c7Sopenharmony_ci int32_t bindLevel = INVALIED_TYPE; 83779a732c7Sopenharmony_ci for (auto &item : profiles) { 83879a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != udid) { 83979a732c7Sopenharmony_ci continue; 84079a732c7Sopenharmony_ci } 84179a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserBundleName() == pkgName && 84279a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid && 84379a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == udid) { 84479a732c7Sopenharmony_ci tokenId = static_cast<uint64_t>(item.GetAccesser().GetAccesserTokenId()); 84579a732c7Sopenharmony_ci bindLevel = static_cast<int32_t>(item.GetBindLevel()); 84679a732c7Sopenharmony_ci LOGI("Src get bindLevel %{public}d, tokenid %{public}" PRId64".", bindLevel, tokenId); 84779a732c7Sopenharmony_ci continue; 84879a732c7Sopenharmony_ci } 84979a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeBundleName() == pkgName && 85079a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid && 85179a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == udid) { 85279a732c7Sopenharmony_ci tokenId = item.GetAccessee().GetAccesseeTokenId(); 85379a732c7Sopenharmony_ci bindLevel = static_cast<int32_t>(item.GetBindLevel()); 85479a732c7Sopenharmony_ci LOGI("Sink get bindLevel %{public}d, tokenid %{public}" PRId64".", bindLevel, tokenId); 85579a732c7Sopenharmony_ci continue; 85679a732c7Sopenharmony_ci } 85779a732c7Sopenharmony_ci } 85879a732c7Sopenharmony_ci return bindLevel; 85979a732c7Sopenharmony_ci} 86079a732c7Sopenharmony_ci 86179a732c7Sopenharmony_cistd::map<std::string, int32_t> DeviceProfileConnector::GetDeviceIdAndBindType(int32_t userId, 86279a732c7Sopenharmony_ci const std::string &accountId, const std::string &localUdid) 86379a732c7Sopenharmony_ci{ 86479a732c7Sopenharmony_ci LOGI("userId %{public}d, accountId %{public}s.", userId, GetAnonyString(accountId).c_str()); 86579a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfileByUserId(userId); 86679a732c7Sopenharmony_ci std::map<std::string, int32_t> deviceIdMap; 86779a732c7Sopenharmony_ci for (const auto &item : profiles) { 86879a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserUserId() == userId && 86979a732c7Sopenharmony_ci item.GetAccesser().GetAccesserAccountId() == accountId && 87079a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid) { 87179a732c7Sopenharmony_ci LOGI("Account logout localUdid %{public}s is src.", GetAnonyString(localUdid).c_str()); 87279a732c7Sopenharmony_ci UpdateBindType(item.GetTrustDeviceId(), item.GetBindType(), deviceIdMap); 87379a732c7Sopenharmony_ci continue; 87479a732c7Sopenharmony_ci } 87579a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeUserId() == userId && 87679a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeAccountId() == accountId && 87779a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid) { 87879a732c7Sopenharmony_ci LOGI("Account logout localUdid %{public}s is sink.", GetAnonyString(localUdid).c_str()); 87979a732c7Sopenharmony_ci UpdateBindType(item.GetTrustDeviceId(), item.GetBindType(), deviceIdMap); 88079a732c7Sopenharmony_ci continue; 88179a732c7Sopenharmony_ci } 88279a732c7Sopenharmony_ci } 88379a732c7Sopenharmony_ci return deviceIdMap; 88479a732c7Sopenharmony_ci} 88579a732c7Sopenharmony_ci 88679a732c7Sopenharmony_civoid DeviceProfileConnector::UpdateBindType(const std::string &udid, int32_t bindType, 88779a732c7Sopenharmony_ci std::map<std::string, int32_t> &deviceMap) 88879a732c7Sopenharmony_ci{ 88979a732c7Sopenharmony_ci LOGI("BindType %{public}d.", bindType); 89079a732c7Sopenharmony_ci if (deviceMap.find(udid) == deviceMap.end()) { 89179a732c7Sopenharmony_ci deviceMap[udid] = bindType; 89279a732c7Sopenharmony_ci } else { 89379a732c7Sopenharmony_ci deviceMap[udid] = std::min(deviceMap[udid], bindType); 89479a732c7Sopenharmony_ci } 89579a732c7Sopenharmony_ci} 89679a732c7Sopenharmony_ci 89779a732c7Sopenharmony_ciint32_t DeviceProfileConnector::HandleAccountLogoutEvent(int32_t remoteUserId, const std::string &remoteAccountHash, 89879a732c7Sopenharmony_ci const std::string &remoteUdid, const std::string &localUdid) 89979a732c7Sopenharmony_ci{ 90079a732c7Sopenharmony_ci LOGI("RemoteUserId %{public}d, remoteAccountHash %{public}s, remoteUdid %{public}s, localUdid %{public}s.", 90179a732c7Sopenharmony_ci remoteUserId, GetAnonyString(remoteAccountHash).c_str(), GetAnonyString(remoteUdid).c_str(), 90279a732c7Sopenharmony_ci GetAnonyString(localUdid).c_str()); 90379a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 90479a732c7Sopenharmony_ci int32_t bindType = DM_INVALIED_BINDTYPE; 90579a732c7Sopenharmony_ci for (const auto &item : profiles) { 90679a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid) { 90779a732c7Sopenharmony_ci continue; 90879a732c7Sopenharmony_ci } 90979a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 91079a732c7Sopenharmony_ci bindType = DM_IDENTICAL_ACCOUNT; 91179a732c7Sopenharmony_ci } 91279a732c7Sopenharmony_ci return bindType; 91379a732c7Sopenharmony_ci} 91479a732c7Sopenharmony_ci 91579a732c7Sopenharmony_ciint32_t DeviceProfileConnector::HandleDevUnBindEvent(int32_t remoteUserId, const std::string &remoteUdid, 91679a732c7Sopenharmony_ci const std::string &localUdid) 91779a732c7Sopenharmony_ci{ 91879a732c7Sopenharmony_ci LOGI("RemoteUserId %{public}d, remoteUdid %{public}s, localUdid %{public}s.", remoteUserId, 91979a732c7Sopenharmony_ci GetAnonyString(remoteUdid).c_str(), GetAnonyString(localUdid).c_str()); 92079a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 92179a732c7Sopenharmony_ci int32_t bindType = DM_INVALIED_BINDTYPE; 92279a732c7Sopenharmony_ci for (const auto &item : profiles) { 92379a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid) { 92479a732c7Sopenharmony_ci continue; 92579a732c7Sopenharmony_ci } 92679a732c7Sopenharmony_ci if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { 92779a732c7Sopenharmony_ci bindType = DM_IDENTICAL_ACCOUNT; 92879a732c7Sopenharmony_ci continue; 92979a732c7Sopenharmony_ci } 93079a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserDeviceId() == remoteUdid && 93179a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid) { 93279a732c7Sopenharmony_ci LOGI("Src device unbind."); 93379a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 93479a732c7Sopenharmony_ci bindType = std::min(bindType, static_cast<int32_t>(item.GetBindType())); 93579a732c7Sopenharmony_ci continue; 93679a732c7Sopenharmony_ci } 93779a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeDeviceId() == remoteUdid && 93879a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid) { 93979a732c7Sopenharmony_ci LOGI("Sink device unbind."); 94079a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 94179a732c7Sopenharmony_ci bindType = std::min(bindType, static_cast<int32_t>(item.GetBindType())); 94279a732c7Sopenharmony_ci continue; 94379a732c7Sopenharmony_ci } 94479a732c7Sopenharmony_ci } 94579a732c7Sopenharmony_ci return bindType; 94679a732c7Sopenharmony_ci} 94779a732c7Sopenharmony_ci 94879a732c7Sopenharmony_cistd::string DeviceProfileConnector::HandleAppUnBindEvent(int32_t remoteUserId, const std::string &remoteUdid, 94979a732c7Sopenharmony_ci int32_t tokenId, const std::string &localUdid) 95079a732c7Sopenharmony_ci{ 95179a732c7Sopenharmony_ci LOGI("RemoteUserId %{public}d, remoteUdid %{public}s, tokenId %{public}d, localUdid %{public}s.", 95279a732c7Sopenharmony_ci remoteUserId, GetAnonyString(remoteUdid).c_str(), tokenId, GetAnonyString(localUdid).c_str()); 95379a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles = GetAccessControlProfile(); 95479a732c7Sopenharmony_ci std::string pkgName = ""; 95579a732c7Sopenharmony_ci for (const auto &item : profiles) { 95679a732c7Sopenharmony_ci if (item.GetTrustDeviceId() != remoteUdid || item.GetBindType() == DM_IDENTICAL_ACCOUNT || 95779a732c7Sopenharmony_ci item.GetBindLevel() != APP) { 95879a732c7Sopenharmony_ci continue; 95979a732c7Sopenharmony_ci } 96079a732c7Sopenharmony_ci if (item.GetAccesser().GetAccesserUserId() == remoteUserId && 96179a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == remoteUdid && 96279a732c7Sopenharmony_ci static_cast<int32_t>(item.GetAccesser().GetAccesserTokenId()) == tokenId && 96379a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == localUdid) { 96479a732c7Sopenharmony_ci LOGI("Src device unbind."); 96579a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 96679a732c7Sopenharmony_ci pkgName = item.GetAccesser().GetAccesserBundleName(); 96779a732c7Sopenharmony_ci continue; 96879a732c7Sopenharmony_ci } 96979a732c7Sopenharmony_ci if (item.GetAccessee().GetAccesseeUserId() == remoteUserId && 97079a732c7Sopenharmony_ci item.GetAccessee().GetAccesseeDeviceId() == remoteUdid && 97179a732c7Sopenharmony_ci static_cast<int32_t>(item.GetAccessee().GetAccesseeTokenId()) == tokenId && 97279a732c7Sopenharmony_ci item.GetAccesser().GetAccesserDeviceId() == localUdid) { 97379a732c7Sopenharmony_ci LOGI("Sink device unbind."); 97479a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(item.GetAccessControlId()); 97579a732c7Sopenharmony_ci pkgName = item.GetAccessee().GetAccesseeBundleName(); 97679a732c7Sopenharmony_ci continue; 97779a732c7Sopenharmony_ci } 97879a732c7Sopenharmony_ci } 97979a732c7Sopenharmony_ci return pkgName; 98079a732c7Sopenharmony_ci} 98179a732c7Sopenharmony_ci 98279a732c7Sopenharmony_cistd::vector<AccessControlProfile> DeviceProfileConnector::GetAllAccessControlProfile() 98379a732c7Sopenharmony_ci{ 98479a732c7Sopenharmony_ci std::vector<AccessControlProfile> profiles; 98579a732c7Sopenharmony_ci if (DistributedDeviceProfileClient::GetInstance().GetAllAccessControlProfile(profiles) != DM_OK) { 98679a732c7Sopenharmony_ci LOGE("DP failed."); 98779a732c7Sopenharmony_ci } 98879a732c7Sopenharmony_ci return profiles; 98979a732c7Sopenharmony_ci} 99079a732c7Sopenharmony_ci 99179a732c7Sopenharmony_civoid DeviceProfileConnector::DeleteAccessControlById(int64_t accessControlId) 99279a732c7Sopenharmony_ci{ 99379a732c7Sopenharmony_ci DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(accessControlId); 99479a732c7Sopenharmony_ci} 99579a732c7Sopenharmony_ci 99679a732c7Sopenharmony_ciIDeviceProfileConnector *CreateDpConnectorInstance() 99779a732c7Sopenharmony_ci{ 99879a732c7Sopenharmony_ci return &DeviceProfileConnector::GetInstance(); 99979a732c7Sopenharmony_ci} 100079a732c7Sopenharmony_ci} // namespace DistributedHardware 100179a732c7Sopenharmony_ci} // namespace OHOS 1002