18e745fdaSopenharmony_ci/* 28e745fdaSopenharmony_ci * Copyright (c) 2024 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 "l2tp_vpn_ctl.h" 178e745fdaSopenharmony_ci 188e745fdaSopenharmony_ci#include <string> 198e745fdaSopenharmony_ci 208e745fdaSopenharmony_ci#include "base64_utils.h" 218e745fdaSopenharmony_ci#include "netmgr_ext_log_wrapper.h" 228e745fdaSopenharmony_ci#include "netmanager_base_common_utils.h" 238e745fdaSopenharmony_ci#include "net_manager_ext_constants.h" 248e745fdaSopenharmony_ci 258e745fdaSopenharmony_cinamespace OHOS { 268e745fdaSopenharmony_cinamespace NetManagerStandard { 278e745fdaSopenharmony_ciL2tpVpnCtl::L2tpVpnCtl(sptr<VpnConfig> config, const std::string &pkg, int32_t userId, 288e745fdaSopenharmony_ci std::vector<int32_t> &activeUserIds) 298e745fdaSopenharmony_ci : IpsecVpnCtl(config, pkg, userId, activeUserIds) 308e745fdaSopenharmony_ci{} 318e745fdaSopenharmony_ci 328e745fdaSopenharmony_ciint32_t L2tpVpnCtl::StopSysVpn() 338e745fdaSopenharmony_ci{ 348e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("stop l2tp vpn"); 358e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_DISCONNECTED; 368e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_DOWN_HOME); 378e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_STOP); 388e745fdaSopenharmony_ci NotifyConnectState(VpnConnectState::VPN_DISCONNECTED); 398e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 408e745fdaSopenharmony_ci} 418e745fdaSopenharmony_ci 428e745fdaSopenharmony_ciint32_t L2tpVpnCtl::StartSysVpn() 438e745fdaSopenharmony_ci{ 448e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("start l2tp vpn"); 458e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_INIT; 468e745fdaSopenharmony_ci InitConfigFile(); 478e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_RESTART); 488e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 498e745fdaSopenharmony_ci} 508e745fdaSopenharmony_ci 518e745fdaSopenharmony_ciint32_t L2tpVpnCtl::InitConfigFile() 528e745fdaSopenharmony_ci{ 538e745fdaSopenharmony_ci CleanTempFiles(); 548e745fdaSopenharmony_ci if (l2tpVpnConfig_ == nullptr) { 558e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("InitConfigFile failed, l2tpVpnConfig_ is null"); 568e745fdaSopenharmony_ci return NETMANAGER_EXT_ERR_INTERNAL; 578e745fdaSopenharmony_ci } 588e745fdaSopenharmony_ci if (!l2tpVpnConfig_->strongswanConf_.empty()) { 598e745fdaSopenharmony_ci std::string strongswanCfg = Base64::Decode(l2tpVpnConfig_->strongswanConf_); 608e745fdaSopenharmony_ci if (!strongswanCfg.empty()) { 618e745fdaSopenharmony_ci CommonUtils::WriteFile(SWAN_CONFIG_FILE, strongswanCfg); 628e745fdaSopenharmony_ci } 638e745fdaSopenharmony_ci } 648e745fdaSopenharmony_ci if (!l2tpVpnConfig_->xl2tpdConf_.empty()) { 658e745fdaSopenharmony_ci std::string xl2tpdConf = Base64::Decode(l2tpVpnConfig_->xl2tpdConf_); 668e745fdaSopenharmony_ci if (!xl2tpdConf.empty()) { 678e745fdaSopenharmony_ci CommonUtils::WriteFile(L2TP_CFG, xl2tpdConf); 688e745fdaSopenharmony_ci } 698e745fdaSopenharmony_ci } 708e745fdaSopenharmony_ci if (!l2tpVpnConfig_->ipsecConf_.empty()) { 718e745fdaSopenharmony_ci std::string ipsecConf = Base64::Decode(l2tpVpnConfig_->ipsecConf_); 728e745fdaSopenharmony_ci if (!ipsecConf.empty()) { 738e745fdaSopenharmony_ci CommonUtils::WriteFile(L2TP_IPSEC_CFG, ipsecConf); 748e745fdaSopenharmony_ci } 758e745fdaSopenharmony_ci } 768e745fdaSopenharmony_ci if (!l2tpVpnConfig_->ipsecSecrets_.empty()) { 778e745fdaSopenharmony_ci std::string ipsecSecrets = Base64::Decode(l2tpVpnConfig_->ipsecSecrets_); 788e745fdaSopenharmony_ci if (!ipsecSecrets.empty()) { 798e745fdaSopenharmony_ci CommonUtils::WriteFile(L2TP_IPSEC_SECRETS_CFG, ipsecSecrets); 808e745fdaSopenharmony_ci } 818e745fdaSopenharmony_ci } 828e745fdaSopenharmony_ci if (!l2tpVpnConfig_->optionsL2tpdClient_.empty()) { 838e745fdaSopenharmony_ci std::string optionsL2tpdClient = Base64::Decode(l2tpVpnConfig_->optionsL2tpdClient_); 848e745fdaSopenharmony_ci if (!optionsL2tpdClient.empty()) { 858e745fdaSopenharmony_ci CommonUtils::WriteFile(OPTIONS_L2TP_CLIENT, optionsL2tpdClient); 868e745fdaSopenharmony_ci } 878e745fdaSopenharmony_ci } 888e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 898e745fdaSopenharmony_ci} 908e745fdaSopenharmony_ci 918e745fdaSopenharmony_ciint32_t L2tpVpnCtl::NotifyConnectStage(const std::string &stage, const int32_t &result) 928e745fdaSopenharmony_ci{ 938e745fdaSopenharmony_ci if (stage.empty()) { 948e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("stage is empty"); 958e745fdaSopenharmony_ci return NETMANAGER_EXT_ERR_PARAMETER_ERROR; 968e745fdaSopenharmony_ci } 978e745fdaSopenharmony_ci if (result != NETMANAGER_EXT_SUCCESS) { 988e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("l2tpVpn stage: %{public}s failed, result: %{public}d", stage.c_str(), result); 998e745fdaSopenharmony_ci return NETMANAGER_EXT_ERR_INTERNAL; 1008e745fdaSopenharmony_ci } 1018e745fdaSopenharmony_ci switch (state_) { 1028e745fdaSopenharmony_ci case IpsecVpnStateCode::STATE_INIT: 1038e745fdaSopenharmony_ci if (stage.compare(IPSEC_START_TAG) == 0) { 1048e745fdaSopenharmony_ci // 1. start l2tp 1058e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("l2tp vpn setup step 1: start l2tp"); 1068e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_STARTED; 1078e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_L2TP_LOAD); 1088e745fdaSopenharmony_ci } 1098e745fdaSopenharmony_ci break; 1108e745fdaSopenharmony_ci case IpsecVpnStateCode::STATE_STARTED: 1118e745fdaSopenharmony_ci if (stage.compare(L2TP_IPSEC_CONFIGURED_TAG) == 0) { 1128e745fdaSopenharmony_ci // 2. start connect 1138e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("l2tp vpn setup step 2: start connect"); 1148e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_CONFIGED; 1158e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_UP_HOME); 1168e745fdaSopenharmony_ci } 1178e745fdaSopenharmony_ci break; 1188e745fdaSopenharmony_ci case IpsecVpnStateCode::STATE_CONFIGED: 1198e745fdaSopenharmony_ci if (stage.compare(IPSEC_CONNECT_TAG) == 0) { 1208e745fdaSopenharmony_ci // 3. set stage IPSEC_L2TP_CTL 1218e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("l2tp vpn setup step 3: set stage IPSEC_L2TP_CTL"); 1228e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_CONTROLLED; 1238e745fdaSopenharmony_ci NetsysController::GetInstance().ProcessVpnStage(SysVpnStageCode::VPN_STAGE_L2TP_CTL); 1248e745fdaSopenharmony_ci } 1258e745fdaSopenharmony_ci break; 1268e745fdaSopenharmony_ci case IpsecVpnStateCode::STATE_CONTROLLED: 1278e745fdaSopenharmony_ci if (stage.compare(L2TP_IPSEC_CONNECTED_TAG) == 0) { 1288e745fdaSopenharmony_ci // 4. is connected 1298e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("l2tp vpn setup step 4: is connected"); 1308e745fdaSopenharmony_ci state_ = IpsecVpnStateCode::STATE_CONNECTED; 1318e745fdaSopenharmony_ci NotifyConnectState(VpnConnectState::VPN_CONNECTED); 1328e745fdaSopenharmony_ci } 1338e745fdaSopenharmony_ci break; 1348e745fdaSopenharmony_ci default: 1358e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("invalid state: %{public}d", state_); 1368e745fdaSopenharmony_ci return NETMANAGER_EXT_ERR_INTERNAL; 1378e745fdaSopenharmony_ci } 1388e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 1398e745fdaSopenharmony_ci} 1408e745fdaSopenharmony_ci 1418e745fdaSopenharmony_ciint32_t L2tpVpnCtl::GetSysVpnCertUri(const int32_t certType, std::string &certUri) 1428e745fdaSopenharmony_ci{ 1438e745fdaSopenharmony_ci if (l2tpVpnConfig_ == nullptr) { 1448e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("GetSysVpnCertUri l2tpVpnConfig_ is null"); 1458e745fdaSopenharmony_ci return NETMANAGER_EXT_ERR_INTERNAL; 1468e745fdaSopenharmony_ci } 1478e745fdaSopenharmony_ci switch (certType) { 1488e745fdaSopenharmony_ci case IpsecVpnCertType::CA_CERT: 1498e745fdaSopenharmony_ci certUri = l2tpVpnConfig_->ipsecCaCertConf_; 1508e745fdaSopenharmony_ci break; 1518e745fdaSopenharmony_ci case IpsecVpnCertType::USER_CERT: 1528e745fdaSopenharmony_ci certUri = l2tpVpnConfig_->ipsecPublicUserCertConf_; 1538e745fdaSopenharmony_ci break; 1548e745fdaSopenharmony_ci case IpsecVpnCertType::SERVER_CERT: 1558e745fdaSopenharmony_ci certUri = l2tpVpnConfig_->ipsecPublicServerCertConf_; 1568e745fdaSopenharmony_ci break; 1578e745fdaSopenharmony_ci default: 1588e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("invalid certType: %{public}d", certType); 1598e745fdaSopenharmony_ci break; 1608e745fdaSopenharmony_ci } 1618e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 1628e745fdaSopenharmony_ci} 1638e745fdaSopenharmony_ci 1648e745fdaSopenharmony_ciint32_t L2tpVpnCtl::GetConnectedSysVpnConfig(sptr<SysVpnConfig> &sysVpnConfig) 1658e745fdaSopenharmony_ci{ 1668e745fdaSopenharmony_ci if (state_ == IpsecVpnStateCode::STATE_CONNECTED && l2tpVpnConfig_ != nullptr) { 1678e745fdaSopenharmony_ci NETMGR_EXT_LOG_I("GetConnectedSysVpnConfig success"); 1688e745fdaSopenharmony_ci sysVpnConfig = l2tpVpnConfig_; 1698e745fdaSopenharmony_ci } 1708e745fdaSopenharmony_ci return NETMANAGER_EXT_SUCCESS; 1718e745fdaSopenharmony_ci} 1728e745fdaSopenharmony_ci} // namespace NetManagerStandard 1738e745fdaSopenharmony_ci} // namespace OHOS 174