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