18e745fdaSopenharmony_ci/*
28e745fdaSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
38e745fdaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48e745fdaSopenharmony_ci * you may not use this file except in compliance with the License.
58e745fdaSopenharmony_ci * You may obtain a copy of the License at
68e745fdaSopenharmony_ci *
78e745fdaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88e745fdaSopenharmony_ci *
98e745fdaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108e745fdaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118e745fdaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128e745fdaSopenharmony_ci * See the License for the specific language governing permissions and
138e745fdaSopenharmony_ci * limitations under the License.
148e745fdaSopenharmony_ci */
158e745fdaSopenharmony_ci
168e745fdaSopenharmony_ci#include "net_vpn_impl.h"
178e745fdaSopenharmony_ci
188e745fdaSopenharmony_ci#include <list>
198e745fdaSopenharmony_ci
208e745fdaSopenharmony_ci#include "bundle_mgr_client.h"
218e745fdaSopenharmony_ci#include "ipc_skeleton.h"
228e745fdaSopenharmony_ci#include "iservice_registry.h"
238e745fdaSopenharmony_ci#include "os_account_manager.h"
248e745fdaSopenharmony_ci#include "system_ability_definition.h"
258e745fdaSopenharmony_ci
268e745fdaSopenharmony_ci#include "net_conn_client.h"
278e745fdaSopenharmony_ci#include "net_manager_constants.h"
288e745fdaSopenharmony_ci#include "net_manager_ext_constants.h"
298e745fdaSopenharmony_ci#include "netmanager_base_common_utils.h"
308e745fdaSopenharmony_ci#include "netmgr_ext_log_wrapper.h"
318e745fdaSopenharmony_ci#include "netsys_controller.h"
328e745fdaSopenharmony_ci#ifdef SUPPORT_SYSVPN
338e745fdaSopenharmony_ci#include "sysvpn_config.h"
348e745fdaSopenharmony_ci#endif // SUPPORT_SYSVPN
358e745fdaSopenharmony_ci
368e745fdaSopenharmony_cinamespace OHOS {
378e745fdaSopenharmony_cinamespace NetManagerStandard {
388e745fdaSopenharmony_cinamespace {
398e745fdaSopenharmony_ciconstexpr int32_t INVALID_UID = -1;
408e745fdaSopenharmony_ciconstexpr int32_t IPV4_NET_MASK_MAX_LENGTH = 32;
418e745fdaSopenharmony_ciconstexpr const char *IPV4_DEFAULT_ROUTE_ADDR = "0.0.0.0";
428e745fdaSopenharmony_ciconstexpr const char *IPV6_DEFAULT_ROUTE_ADDR = "fe80::";
438e745fdaSopenharmony_ci} // namespace
448e745fdaSopenharmony_ci
458e745fdaSopenharmony_ciNetVpnImpl::NetVpnImpl(sptr<VpnConfig> config, const std::string &pkg, int32_t userId, std::vector<int32_t> &activeUserIds)
468e745fdaSopenharmony_ci    : vpnConfig_(config), pkgName_(pkg), userId_(userId), activeUserIds_(activeUserIds)
478e745fdaSopenharmony_ci{
488e745fdaSopenharmony_ci    netSupplierInfo_ = new (std::nothrow) NetSupplierInfo();
498e745fdaSopenharmony_ci    if (netSupplierInfo_ == nullptr) {
508e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("NetSupplierInfo new failed");
518e745fdaSopenharmony_ci    }
528e745fdaSopenharmony_ci}
538e745fdaSopenharmony_ci
548e745fdaSopenharmony_ciint32_t NetVpnImpl::RegisterConnectStateChangedCb(std::shared_ptr<IVpnConnStateCb> callback)
558e745fdaSopenharmony_ci{
568e745fdaSopenharmony_ci    if (callback == nullptr) {
578e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Register vpn connect callback is null.");
588e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
598e745fdaSopenharmony_ci    }
608e745fdaSopenharmony_ci    connChangedCb_ = callback;
618e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
628e745fdaSopenharmony_ci}
638e745fdaSopenharmony_ci
648e745fdaSopenharmony_civoid NetVpnImpl::NotifyConnectState(const VpnConnectState &state)
658e745fdaSopenharmony_ci{
668e745fdaSopenharmony_ci    if (connChangedCb_ == nullptr) {
678e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("NotifyConnectState connect callback is null.");
688e745fdaSopenharmony_ci        return;
698e745fdaSopenharmony_ci    }
708e745fdaSopenharmony_ci    connChangedCb_->OnVpnConnStateChanged(state);
718e745fdaSopenharmony_ci}
728e745fdaSopenharmony_ci
738e745fdaSopenharmony_ciint32_t NetVpnImpl::SetUp()
748e745fdaSopenharmony_ci{
758e745fdaSopenharmony_ci    if (vpnConfig_ == nullptr) {
768e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("VpnConnect vpnConfig_ is nullptr");
778e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
788e745fdaSopenharmony_ci    }
798e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("SetUp interface name:%{public}s", TUN_CARD_NAME);
808e745fdaSopenharmony_ci    VpnEventType legacy = IsInternalVpn() ? VpnEventType::TYPE_LEGACY : VpnEventType::TYPE_EXTENDED;
818e745fdaSopenharmony_ci
828e745fdaSopenharmony_ci    auto &netConnClientIns = NetConnClient::GetInstance();
838e745fdaSopenharmony_ci    if (!RegisterNetSupplier(netConnClientIns)) {
848e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_REG_NET_SUPPLIER_ERROR,
858e745fdaSopenharmony_ci                                                 "register Supplier failed");
868e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
878e745fdaSopenharmony_ci    }
888e745fdaSopenharmony_ci
898e745fdaSopenharmony_ci    if (!UpdateNetSupplierInfo(netConnClientIns, true)) {
908e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_UPDATE_SUPPLIER_INFO_ERROR,
918e745fdaSopenharmony_ci                                                 "update Supplier info failed");
928e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
938e745fdaSopenharmony_ci    }
948e745fdaSopenharmony_ci
958e745fdaSopenharmony_ci    if (!UpdateNetLinkInfo()) {
968e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_UPDATE_NETLINK_INFO_ERROR,
978e745fdaSopenharmony_ci                                                 "update link info failed");
988e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
998e745fdaSopenharmony_ci    }
1008e745fdaSopenharmony_ci
1018e745fdaSopenharmony_ci    std::list<int32_t> netIdList;
1028e745fdaSopenharmony_ci    netConnClientIns.GetNetIdByIdentifier(TUN_CARD_NAME, netIdList);
1038e745fdaSopenharmony_ci    if (netIdList.size() == 0) {
1048e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("get netId failed, netId list size is 0");
1058e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_INTERNAL_ERROR, "get Net id failed");
1068e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
1078e745fdaSopenharmony_ci    }
1088e745fdaSopenharmony_ci    netId_ = *(netIdList.begin());
1098e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("vpn network netid: %{public}d", netId_);
1108e745fdaSopenharmony_ci
1118e745fdaSopenharmony_ci    SetAllUidRanges();
1128e745fdaSopenharmony_ci    if (NetsysController::GetInstance().NetworkAddUids(netId_, beginUids_, endUids_)) {
1138e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpn set whitelist rule error");
1148e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_SET_APP_UID_RULE_ERROR,
1158e745fdaSopenharmony_ci                                                 "set app uid rule failed");
1168e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
1178e745fdaSopenharmony_ci    }
1188e745fdaSopenharmony_ci#ifdef SUPPORT_SYSVPN
1198e745fdaSopenharmony_ci    if (!IsSystemVpn()) {
1208e745fdaSopenharmony_ci        NotifyConnectState(VpnConnectState::VPN_CONNECTED);
1218e745fdaSopenharmony_ci    }
1228e745fdaSopenharmony_ci#else
1238e745fdaSopenharmony_ci    NotifyConnectState(VpnConnectState::VPN_CONNECTED);
1248e745fdaSopenharmony_ci#endif
1258e745fdaSopenharmony_ci    isVpnConnecting_ = true;
1268e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
1278e745fdaSopenharmony_ci}
1288e745fdaSopenharmony_ci
1298e745fdaSopenharmony_civoid NetVpnImpl::SetAllUidRanges()
1308e745fdaSopenharmony_ci{
1318e745fdaSopenharmony_ci    GenerateUidRanges(userId_, beginUids_, endUids_);
1328e745fdaSopenharmony_ci#ifdef ENABLE_VPN_FOR_USER0
1338e745fdaSopenharmony_ci    bool hasUser0 = userId_ == 0;
1348e745fdaSopenharmony_ci#endif
1358e745fdaSopenharmony_ci    for (auto &elem : activeUserIds_) {
1368e745fdaSopenharmony_ci        GenerateUidRanges(elem, beginUids_, endUids_);
1378e745fdaSopenharmony_ci#ifdef ENABLE_VPN_FOR_USER0
1388e745fdaSopenharmony_ci        hasUser0 = hasUser0 || elem == 0;
1398e745fdaSopenharmony_ci#endif
1408e745fdaSopenharmony_ci    }
1418e745fdaSopenharmony_ci#ifdef ENABLE_VPN_FOR_USER0
1428e745fdaSopenharmony_ci    if (!hasUser0) {
1438e745fdaSopenharmony_ci        GenerateUidRanges(0, beginUids_, endUids_);
1448e745fdaSopenharmony_ci    }
1458e745fdaSopenharmony_ci#endif
1468e745fdaSopenharmony_ci}
1478e745fdaSopenharmony_ci
1488e745fdaSopenharmony_ciint32_t NetVpnImpl::ResumeUids()
1498e745fdaSopenharmony_ci{
1508e745fdaSopenharmony_ci    if (!isVpnConnecting_) {
1518e745fdaSopenharmony_ci        NETMGR_EXT_LOG_I("unecessary to resume uids");
1528e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
1538e745fdaSopenharmony_ci    }
1548e745fdaSopenharmony_ci
1558e745fdaSopenharmony_ci    if (NetsysController::GetInstance().NetworkAddUids(netId_, beginUids_, endUids_)) {
1568e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpn set whitelist rule error");
1578e745fdaSopenharmony_ci        VpnEventType legacy = IsInternalVpn() ? VpnEventType::TYPE_LEGACY : VpnEventType::TYPE_EXTENDED;
1588e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnSetting(legacy, VpnEventErrorType::ERROR_SET_APP_UID_RULE_ERROR,
1598e745fdaSopenharmony_ci            "set app uid rule failed");
1608e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_INTERNAL;
1618e745fdaSopenharmony_ci    }
1628e745fdaSopenharmony_ci
1638e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
1648e745fdaSopenharmony_ci}
1658e745fdaSopenharmony_ci
1668e745fdaSopenharmony_ciint32_t NetVpnImpl::Destroy()
1678e745fdaSopenharmony_ci{
1688e745fdaSopenharmony_ci    VpnEventType legacy = IsInternalVpn() ? VpnEventType::TYPE_LEGACY : VpnEventType::TYPE_EXTENDED;
1698e745fdaSopenharmony_ci    if (NetsysController::GetInstance().NetworkDelUids(netId_, beginUids_, endUids_)) {
1708e745fdaSopenharmony_ci        NETMGR_EXT_LOG_W("vpn remove whitelist rule error");
1718e745fdaSopenharmony_ci        VpnHisysEvent::SendFaultEventConnDestroy(legacy, VpnEventErrorType::ERROR_SET_APP_UID_RULE_ERROR,
1728e745fdaSopenharmony_ci                                                 "remove app uid rule failed");
1738e745fdaSopenharmony_ci    }
1748e745fdaSopenharmony_ci
1758e745fdaSopenharmony_ci    auto &netConnClientIns = NetConnClient::GetInstance();
1768e745fdaSopenharmony_ci    DelNetLinkInfo(netConnClientIns);
1778e745fdaSopenharmony_ci    UpdateNetSupplierInfo(netConnClientIns, false);
1788e745fdaSopenharmony_ci    UnregisterNetSupplier(netConnClientIns);
1798e745fdaSopenharmony_ci#ifdef SUPPORT_SYSVPN
1808e745fdaSopenharmony_ci    if (!IsSystemVpn()) {
1818e745fdaSopenharmony_ci        NotifyConnectState(VpnConnectState::VPN_DISCONNECTED);
1828e745fdaSopenharmony_ci    }
1838e745fdaSopenharmony_ci#else
1848e745fdaSopenharmony_ci    NotifyConnectState(VpnConnectState::VPN_DISCONNECTED);
1858e745fdaSopenharmony_ci#endif
1868e745fdaSopenharmony_ci    isVpnConnecting_ = false;
1878e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
1888e745fdaSopenharmony_ci}
1898e745fdaSopenharmony_ci
1908e745fdaSopenharmony_ci#ifdef SUPPORT_SYSVPN
1918e745fdaSopenharmony_ciint32_t NetVpnImpl::GetConnectedSysVpnConfig(sptr<SysVpnConfig> &vpnConfig)
1928e745fdaSopenharmony_ci{
1938e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
1948e745fdaSopenharmony_ci}
1958e745fdaSopenharmony_ci
1968e745fdaSopenharmony_ciint32_t NetVpnImpl::NotifyConnectStage(const std::string &stage, const int32_t &result)
1978e745fdaSopenharmony_ci{
1988e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
1998e745fdaSopenharmony_ci}
2008e745fdaSopenharmony_ci
2018e745fdaSopenharmony_ciint32_t NetVpnImpl::GetSysVpnCertUri(const int32_t certType, std::string &certUri)
2028e745fdaSopenharmony_ci{
2038e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
2048e745fdaSopenharmony_ci}
2058e745fdaSopenharmony_cibool NetVpnImpl::IsSystemVpn()
2068e745fdaSopenharmony_ci{
2078e745fdaSopenharmony_ci    return false;
2088e745fdaSopenharmony_ci}
2098e745fdaSopenharmony_ci#endif // SUPPORT_SYSVPN
2108e745fdaSopenharmony_ci
2118e745fdaSopenharmony_cibool NetVpnImpl::RegisterNetSupplier(NetConnClient &netConnClientIns)
2128e745fdaSopenharmony_ci{
2138e745fdaSopenharmony_ci    if (netSupplierId_) {
2148e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("NetSupplier [%{public}d] has been registered ", netSupplierId_);
2158e745fdaSopenharmony_ci        return false;
2168e745fdaSopenharmony_ci    }
2178e745fdaSopenharmony_ci    std::set<NetCap> netCap;
2188e745fdaSopenharmony_ci    netCap.insert(NET_CAPABILITY_INTERNET);
2198e745fdaSopenharmony_ci    if (vpnConfig_->isMetered_ == false) {
2208e745fdaSopenharmony_ci        netCap.insert(NET_CAPABILITY_NOT_METERED);
2218e745fdaSopenharmony_ci    }
2228e745fdaSopenharmony_ci    if (netConnClientIns.RegisterNetSupplier(BEARER_VPN, TUN_CARD_NAME, netCap, netSupplierId_) != NETMANAGER_SUCCESS) {
2238e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpn netManager RegisterNetSupplier error.");
2248e745fdaSopenharmony_ci        return false;
2258e745fdaSopenharmony_ci    }
2268e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("vpn RegisterNetSupplier netSupplierId_[%{public}d]", netSupplierId_);
2278e745fdaSopenharmony_ci    return true;
2288e745fdaSopenharmony_ci}
2298e745fdaSopenharmony_ci
2308e745fdaSopenharmony_civoid NetVpnImpl::UnregisterNetSupplier(NetConnClient &netConnClientIns)
2318e745fdaSopenharmony_ci{
2328e745fdaSopenharmony_ci    if (!netSupplierId_) {
2338e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("NetSupplier [%{public}d] has been unregistered ", netSupplierId_);
2348e745fdaSopenharmony_ci        return;
2358e745fdaSopenharmony_ci    }
2368e745fdaSopenharmony_ci    if (!netConnClientIns.UnregisterNetSupplier(netSupplierId_)) {
2378e745fdaSopenharmony_ci        netSupplierId_ = 0;
2388e745fdaSopenharmony_ci    }
2398e745fdaSopenharmony_ci}
2408e745fdaSopenharmony_ci
2418e745fdaSopenharmony_cibool NetVpnImpl::UpdateNetSupplierInfo(NetConnClient &netConnClientIns, bool isAvailable)
2428e745fdaSopenharmony_ci{
2438e745fdaSopenharmony_ci    if (!netSupplierId_) {
2448e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpn UpdateNetSupplierInfo error, netSupplierId is zero");
2458e745fdaSopenharmony_ci        return false;
2468e745fdaSopenharmony_ci    }
2478e745fdaSopenharmony_ci    if (netSupplierInfo_ == nullptr) {
2488e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpn UpdateNetSupplierInfo netSupplierInfo_ is nullptr");
2498e745fdaSopenharmony_ci        return false;
2508e745fdaSopenharmony_ci    }
2518e745fdaSopenharmony_ci    netSupplierInfo_->isAvailable_ = isAvailable;
2528e745fdaSopenharmony_ci    netConnClientIns.UpdateNetSupplierInfo(netSupplierId_, netSupplierInfo_);
2538e745fdaSopenharmony_ci    return true;
2548e745fdaSopenharmony_ci}
2558e745fdaSopenharmony_ci
2568e745fdaSopenharmony_cibool NetVpnImpl::UpdateNetLinkInfo()
2578e745fdaSopenharmony_ci{
2588e745fdaSopenharmony_ci    if (vpnConfig_ == nullptr) {
2598e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("vpnConfig_ is nullptr");
2608e745fdaSopenharmony_ci        return false;
2618e745fdaSopenharmony_ci    }
2628e745fdaSopenharmony_ci    sptr<NetLinkInfo> linkInfo = new (std::nothrow) NetLinkInfo();
2638e745fdaSopenharmony_ci    if (linkInfo == nullptr) {
2648e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("linkInfo is nullptr");
2658e745fdaSopenharmony_ci        return false;
2668e745fdaSopenharmony_ci    }
2678e745fdaSopenharmony_ci
2688e745fdaSopenharmony_ci    linkInfo->ifaceName_ = TUN_CARD_NAME;
2698e745fdaSopenharmony_ci    linkInfo->netAddrList_.assign(vpnConfig_->addresses_.begin(), vpnConfig_->addresses_.end());
2708e745fdaSopenharmony_ci
2718e745fdaSopenharmony_ci    if (vpnConfig_->routes_.empty()) {
2728e745fdaSopenharmony_ci        if (vpnConfig_->isAcceptIPv4_ == true) {
2738e745fdaSopenharmony_ci            Route ipv4DefaultRoute;
2748e745fdaSopenharmony_ci            SetIpv4DefaultRoute(ipv4DefaultRoute);
2758e745fdaSopenharmony_ci            linkInfo->routeList_.emplace_back(ipv4DefaultRoute);
2768e745fdaSopenharmony_ci        }
2778e745fdaSopenharmony_ci        if (vpnConfig_->isAcceptIPv6_== true) {
2788e745fdaSopenharmony_ci            Route ipv6DefaultRoute;
2798e745fdaSopenharmony_ci            SetIpv6DefaultRoute(ipv6DefaultRoute);
2808e745fdaSopenharmony_ci            linkInfo->routeList_.emplace_back(ipv6DefaultRoute);
2818e745fdaSopenharmony_ci        }
2828e745fdaSopenharmony_ci    } else {
2838e745fdaSopenharmony_ci        linkInfo->routeList_.assign(vpnConfig_->routes_.begin(), vpnConfig_->routes_.end());
2848e745fdaSopenharmony_ci        for (auto &route : linkInfo->routeList_) {
2858e745fdaSopenharmony_ci            AdjustRouteInfo(route);
2868e745fdaSopenharmony_ci        }
2878e745fdaSopenharmony_ci    }
2888e745fdaSopenharmony_ci
2898e745fdaSopenharmony_ci    for (auto dnsServer : vpnConfig_->dnsAddresses_) {
2908e745fdaSopenharmony_ci        INetAddr dns;
2918e745fdaSopenharmony_ci        if (vpnConfig_->isAcceptIPv4_ == true) {
2928e745fdaSopenharmony_ci            dns.type_ = INetAddr::IpType::IPV4;
2938e745fdaSopenharmony_ci        } else {
2948e745fdaSopenharmony_ci            dns.type_ = INetAddr::IpType::IPV6;
2958e745fdaSopenharmony_ci        }
2968e745fdaSopenharmony_ci        dns.address_ = dnsServer;
2978e745fdaSopenharmony_ci        linkInfo->dnsList_.emplace_back(dns);
2988e745fdaSopenharmony_ci    }
2998e745fdaSopenharmony_ci
3008e745fdaSopenharmony_ci    for (auto domain : vpnConfig_->searchDomains_) {
3018e745fdaSopenharmony_ci        linkInfo->domain_.append(domain).append(" ");
3028e745fdaSopenharmony_ci    }
3038e745fdaSopenharmony_ci    linkInfo->mtu_ = vpnConfig_->mtu_;
3048e745fdaSopenharmony_ci    NetConnClient::GetInstance().UpdateNetLinkInfo(netSupplierId_, linkInfo);
3058e745fdaSopenharmony_ci    return true;
3068e745fdaSopenharmony_ci}
3078e745fdaSopenharmony_ci
3088e745fdaSopenharmony_civoid NetVpnImpl::SetIpv4DefaultRoute(Route &ipv4DefaultRoute)
3098e745fdaSopenharmony_ci{
3108e745fdaSopenharmony_ci    ipv4DefaultRoute.iface_ = TUN_CARD_NAME;
3118e745fdaSopenharmony_ci    ipv4DefaultRoute.destination_.type_ = INetAddr::IPV4;
3128e745fdaSopenharmony_ci    ipv4DefaultRoute.destination_.address_ = IPV4_DEFAULT_ROUTE_ADDR;
3138e745fdaSopenharmony_ci    ipv4DefaultRoute.destination_.prefixlen_ = CommonUtils::GetMaskLength(IPV4_DEFAULT_ROUTE_ADDR);
3148e745fdaSopenharmony_ci    ipv4DefaultRoute.gateway_.address_ = IPV4_DEFAULT_ROUTE_ADDR;
3158e745fdaSopenharmony_ci}
3168e745fdaSopenharmony_ci
3178e745fdaSopenharmony_civoid NetVpnImpl::SetIpv6DefaultRoute(Route &ipv6DefaultRoute)
3188e745fdaSopenharmony_ci{
3198e745fdaSopenharmony_ci    ipv6DefaultRoute.iface_ = TUN_CARD_NAME;
3208e745fdaSopenharmony_ci    ipv6DefaultRoute.destination_.type_ = INetAddr::IPV6;
3218e745fdaSopenharmony_ci    ipv6DefaultRoute.destination_.address_ = IPV6_DEFAULT_ROUTE_ADDR;
3228e745fdaSopenharmony_ci    ipv6DefaultRoute.destination_.prefixlen_ = CommonUtils::Ipv6PrefixLen(IPV6_DEFAULT_ROUTE_ADDR);
3238e745fdaSopenharmony_ci    ipv6DefaultRoute.gateway_.address_ = IPV6_DEFAULT_ROUTE_ADDR;
3248e745fdaSopenharmony_ci}
3258e745fdaSopenharmony_ci
3268e745fdaSopenharmony_civoid NetVpnImpl::DelNetLinkInfo(NetConnClient &netConnClientIns)
3278e745fdaSopenharmony_ci{
3288e745fdaSopenharmony_ci    for (auto &route : vpnConfig_->routes_) {
3298e745fdaSopenharmony_ci        AdjustRouteInfo(route);
3308e745fdaSopenharmony_ci        std::string destAddress = route.destination_.address_ + "/" + std::to_string(route.destination_.prefixlen_);
3318e745fdaSopenharmony_ci        NetsysController::GetInstance().NetworkRemoveRoute(netId_, route.iface_, destAddress, route.gateway_.address_);
3328e745fdaSopenharmony_ci    }
3338e745fdaSopenharmony_ci}
3348e745fdaSopenharmony_ci
3358e745fdaSopenharmony_civoid NetVpnImpl::AdjustRouteInfo(Route &route)
3368e745fdaSopenharmony_ci{
3378e745fdaSopenharmony_ci    if (route.iface_.empty()) {
3388e745fdaSopenharmony_ci        route.iface_ = TUN_CARD_NAME;
3398e745fdaSopenharmony_ci    }
3408e745fdaSopenharmony_ci    if (vpnConfig_->isAcceptIPv4_ == true) {
3418e745fdaSopenharmony_ci        uint32_t maskUint = (0xFFFFFFFF << (IPV4_NET_MASK_MAX_LENGTH - route.destination_.prefixlen_));
3428e745fdaSopenharmony_ci        uint32_t ipAddrUint = CommonUtils::ConvertIpv4Address(route.destination_.address_);
3438e745fdaSopenharmony_ci        uint32_t subNetAddress = ipAddrUint & maskUint;
3448e745fdaSopenharmony_ci        route.destination_.address_ = CommonUtils::ConvertIpv4Address(subNetAddress);
3458e745fdaSopenharmony_ci    } else {
3468e745fdaSopenharmony_ci        route.destination_.address_ = CommonUtils::GetIpv6Prefix(route.destination_.address_,
3478e745fdaSopenharmony_ci            route.destination_.prefixlen_);
3488e745fdaSopenharmony_ci    }
3498e745fdaSopenharmony_ci}
3508e745fdaSopenharmony_ci
3518e745fdaSopenharmony_civoid NetVpnImpl::GenerateUidRangesByAcceptedApps(const std::set<int32_t> &uids, std::vector<int32_t> &beginUids,
3528e745fdaSopenharmony_ci                                                 std::vector<int32_t> &endUids)
3538e745fdaSopenharmony_ci{
3548e745fdaSopenharmony_ci    int32_t start = INVALID_UID;
3558e745fdaSopenharmony_ci    int32_t stop = INVALID_UID;
3568e745fdaSopenharmony_ci    for (int32_t uid : uids) {
3578e745fdaSopenharmony_ci        if (start == INVALID_UID) {
3588e745fdaSopenharmony_ci            start = uid;
3598e745fdaSopenharmony_ci        } else if (uid != stop + 1) {
3608e745fdaSopenharmony_ci            beginUids.push_back(start);
3618e745fdaSopenharmony_ci            endUids.push_back(stop);
3628e745fdaSopenharmony_ci            start = uid;
3638e745fdaSopenharmony_ci        }
3648e745fdaSopenharmony_ci        stop = uid;
3658e745fdaSopenharmony_ci    }
3668e745fdaSopenharmony_ci    if (start != INVALID_UID) {
3678e745fdaSopenharmony_ci        beginUids.push_back(start);
3688e745fdaSopenharmony_ci        endUids.push_back(stop);
3698e745fdaSopenharmony_ci    }
3708e745fdaSopenharmony_ci}
3718e745fdaSopenharmony_ci
3728e745fdaSopenharmony_civoid NetVpnImpl::GenerateUidRangesByRefusedApps(int32_t userId, const std::set<int32_t> &uids, std::vector<int32_t> &beginUids,
3738e745fdaSopenharmony_ci                                                std::vector<int32_t> &endUids)
3748e745fdaSopenharmony_ci{
3758e745fdaSopenharmony_ci    int32_t start = userId * AppExecFwk::Constants::BASE_USER_RANGE;
3768e745fdaSopenharmony_ci    int32_t stop = userId * AppExecFwk::Constants::BASE_USER_RANGE + AppExecFwk::Constants::MAX_APP_UID;
3778e745fdaSopenharmony_ci    for (int32_t uid : uids) {
3788e745fdaSopenharmony_ci        if (uid == start) {
3798e745fdaSopenharmony_ci            start++;
3808e745fdaSopenharmony_ci        } else {
3818e745fdaSopenharmony_ci            beginUids.push_back(start);
3828e745fdaSopenharmony_ci            endUids.push_back(uid - 1);
3838e745fdaSopenharmony_ci            start = uid + 1;
3848e745fdaSopenharmony_ci        }
3858e745fdaSopenharmony_ci    }
3868e745fdaSopenharmony_ci    if (start <= stop) {
3878e745fdaSopenharmony_ci        beginUids.push_back(start);
3888e745fdaSopenharmony_ci        endUids.push_back(stop);
3898e745fdaSopenharmony_ci    }
3908e745fdaSopenharmony_ci}
3918e745fdaSopenharmony_ci
3928e745fdaSopenharmony_cistd::set<int32_t> NetVpnImpl::GetAppsUids(int32_t userId, const std::vector<std::string> &applications)
3938e745fdaSopenharmony_ci{
3948e745fdaSopenharmony_ci    std::set<int32_t> uids;
3958e745fdaSopenharmony_ci    auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
3968e745fdaSopenharmony_ci    if (systemAbilityManager == nullptr) {
3978e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("systemAbilityManager is null.");
3988e745fdaSopenharmony_ci        return uids;
3998e745fdaSopenharmony_ci    }
4008e745fdaSopenharmony_ci    auto bundleMgrSa = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
4018e745fdaSopenharmony_ci    if (bundleMgrSa == nullptr) {
4028e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("bundleMgrSa is null.");
4038e745fdaSopenharmony_ci        return uids;
4048e745fdaSopenharmony_ci    }
4058e745fdaSopenharmony_ci    auto bundleMgr = iface_cast<AppExecFwk::IBundleMgr>(bundleMgrSa);
4068e745fdaSopenharmony_ci    if (bundleMgr == nullptr) {
4078e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("iface_cast is null.");
4088e745fdaSopenharmony_ci        return uids;
4098e745fdaSopenharmony_ci    }
4108e745fdaSopenharmony_ci
4118e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("userId: %{public}d.", userId);
4128e745fdaSopenharmony_ci    AppExecFwk::ApplicationFlag flags = AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO;
4138e745fdaSopenharmony_ci    for (auto app : applications) {
4148e745fdaSopenharmony_ci        AppExecFwk::ApplicationInfo appInfo;
4158e745fdaSopenharmony_ci        if (bundleMgr->GetApplicationInfo(app, flags, userId, appInfo)) {
4168e745fdaSopenharmony_ci            NETMGR_EXT_LOG_I("app: %{public}s success, uid=%{public}d.", app.c_str(), appInfo.uid);
4178e745fdaSopenharmony_ci            uids.insert(appInfo.uid);
4188e745fdaSopenharmony_ci        } else {
4198e745fdaSopenharmony_ci            NETMGR_EXT_LOG_E("app: %{public}s error.", app.c_str());
4208e745fdaSopenharmony_ci        }
4218e745fdaSopenharmony_ci    }
4228e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("uids.size: %{public}zd.", uids.size());
4238e745fdaSopenharmony_ci    return uids;
4248e745fdaSopenharmony_ci}
4258e745fdaSopenharmony_ci
4268e745fdaSopenharmony_ciint32_t NetVpnImpl::GenerateUidRanges(int32_t userId, std::vector<int32_t> &beginUids, std::vector<int32_t> &endUids)
4278e745fdaSopenharmony_ci{
4288e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("GenerateUidRanges userId:%{public}d.", userId);
4298e745fdaSopenharmony_ci    if (userId == AppExecFwk::Constants::INVALID_USERID) {
4308e745fdaSopenharmony_ci        userId = AppExecFwk::Constants::START_USERID;
4318e745fdaSopenharmony_ci    }
4328e745fdaSopenharmony_ci    if (vpnConfig_->acceptedApplications_.size()) {
4338e745fdaSopenharmony_ci        std::set<int32_t> uids = GetAppsUids(userId, vpnConfig_->acceptedApplications_);
4348e745fdaSopenharmony_ci        GenerateUidRangesByAcceptedApps(uids, beginUids, endUids);
4358e745fdaSopenharmony_ci    } else if (vpnConfig_->refusedApplications_.size()) {
4368e745fdaSopenharmony_ci        std::set<int32_t> uids = GetAppsUids(userId, vpnConfig_->refusedApplications_);
4378e745fdaSopenharmony_ci        GenerateUidRangesByRefusedApps(userId, uids, beginUids, endUids);
4388e745fdaSopenharmony_ci    } else {
4398e745fdaSopenharmony_ci        int32_t start = userId * AppExecFwk::Constants::BASE_USER_RANGE;
4408e745fdaSopenharmony_ci        int32_t stop = userId * AppExecFwk::Constants::BASE_USER_RANGE + AppExecFwk::Constants::MAX_APP_UID;
4418e745fdaSopenharmony_ci        beginUids.push_back(start);
4428e745fdaSopenharmony_ci        endUids.push_back(stop);
4438e745fdaSopenharmony_ci        NETMGR_EXT_LOG_I("GenerateUidRanges default all app, uid range: %{public}d -- %{public}d.", start, stop);
4448e745fdaSopenharmony_ci    }
4458e745fdaSopenharmony_ci    return NETMANAGER_EXT_SUCCESS;
4468e745fdaSopenharmony_ci}
4478e745fdaSopenharmony_ci
4488e745fdaSopenharmony_ci} // namespace NetManagerStandard
4498e745fdaSopenharmony_ci} // namespace OHOS
450