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