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