Ikev2 support

This commit is contained in:
pokamest 2021-10-04 19:07:49 +03:00
parent a5bcf1a02d
commit fa151cd320
27 changed files with 626 additions and 90 deletions

View file

@ -0,0 +1,57 @@
#include <QCoreApplication>
#include <QFileInfo>
#include <QProcess>
#include <QRegularExpression>
#include <QTcpSocket>
#include <QThread>
#include "debug.h"
#include "ikev2_vpn_protocol.h"
#include "utils.h"
Ikev2Protocol::Ikev2Protocol(const QJsonObject &configuration, QObject* parent) :
VpnProtocol(configuration, parent)
{
//m_configFile.setFileTemplate(QDir::tempPath() + QDir::separator() + serviceName() + ".conf");
readIkev2Configuration(configuration);
}
Ikev2Protocol::~Ikev2Protocol()
{
qDebug() << "IpsecProtocol::~IpsecProtocol()";
Ikev2Protocol::stop();
QThread::msleep(200);
}
void Ikev2Protocol::stop()
{
#ifndef Q_OS_IOS
#endif
}
void Ikev2Protocol::readIkev2Configuration(const QJsonObject &configuration)
{
m_config = configuration.value(config::key_ikev2_config_data).toObject();
}
ErrorCode Ikev2Protocol::start()
{
#ifndef Q_OS_IOS
QByteArray cert = QByteArray::fromBase64(m_config[config_key::cert].toString().toUtf8());
qDebug() << "Ikev2Protocol::start()" << cert;
QTemporaryFile certFile;
certFile.open();
certFile.write(cert);
certFile.close();
return ErrorCode::NoError;
#endif
}

View file

@ -0,0 +1,32 @@
#ifndef IPSEC_PROTOCOL_H
#define IPSEC_PROTOCOL_H
#include <QObject>
#include <QProcess>
#include <QString>
#include <QTemporaryFile>
#include <QTimer>
#include "vpnprotocol.h"
#include "core/ipcclient.h"
class Ikev2Protocol : public VpnProtocol
{
Q_OBJECT
public:
explicit Ikev2Protocol(const QJsonObject& configuration, QObject* parent = nullptr);
virtual ~Ikev2Protocol() override;
ErrorCode start() override;
void stop() override;
private:
void readIkev2Configuration(const QJsonObject &configuration);
private:
QJsonObject m_config;
};
#endif // IPSEC_PROTOCOL_H

View file

@ -57,7 +57,7 @@ void OpenVpnProtocol::stop()
}
}
ErrorCode OpenVpnProtocol::checkAndSetupTapDriver()
ErrorCode OpenVpnProtocol::prepare()
{
if (!IpcClient::Interface()) {
return ErrorCode::AmneziaServiceConnectionFailed;

View file

@ -21,7 +21,7 @@ public:
ErrorCode start() override;
void stop() override;
ErrorCode checkAndSetupTapDriver();
ErrorCode prepare() override;
static QString defaultConfigFileName();
static QString defaultConfigPath();

View file

@ -16,6 +16,7 @@ constexpr char port[] = "port";
constexpr char local_port[] = "local_port";
constexpr char description[] = "description";
constexpr char cert[] = "cert";
constexpr char containers[] = "containers";
@ -23,7 +24,6 @@ constexpr char container[] = "container";
constexpr char defaultContainer[] = "defaultContainer";
constexpr char protocols[] = "protocols";
//constexpr char protocol[] = "protocol";
constexpr char remote[] = "remote";
constexpr char transport_proto[] = "transport_proto";

View file

@ -4,6 +4,13 @@
#include "vpnprotocol.h"
#include "core/errorstrings.h"
#include "openvpnprotocol.h"
#include "shadowsocksvpnprotocol.h"
#include "openvpnovercloakprotocol.h"
#include "wireguardprotocol.h"
#include "ikev2_vpn_protocol.h"
VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject* parent)
: QObject(parent),
m_connectionState(ConnectionState::Unknown),
@ -88,6 +95,19 @@ QString VpnProtocol::vpnGateway() const
return m_vpnGateway;
}
VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject& configuration)
{
switch (container) {
case DockerContainer::OpenVpn: return new OpenVpnProtocol(configuration);
case DockerContainer::Cloak: return new OpenVpnOverCloakProtocol(configuration);
case DockerContainer::ShadowSocks: return new ShadowSocksVpnProtocol(configuration);
case DockerContainer::WireGuard: return new WireguardProtocol(configuration);
case DockerContainer::Ipsec: return new Ikev2Protocol(configuration);
default: return nullptr;
}
}
QString VpnProtocol::routeGateway() const
{
return m_routeGateway;

View file

@ -6,6 +6,8 @@
#include <QJsonObject>
#include "core/defs.h"
#include "containers/containers_defs.h"
using namespace amnezia;
class QTimer;
@ -23,6 +25,7 @@ public:
static QString textConnectionState(ConnectionState connectionState);
virtual ErrorCode prepare() { return ErrorCode::NoError; }
virtual bool isConnected() const;
virtual bool isDisconnected() const;
@ -37,6 +40,8 @@ public:
QString routeGateway() const;
QString vpnGateway() const;
static VpnProtocol* factory(amnezia::DockerContainer container, const QJsonObject &configuration);
signals:
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
void connectionStateChanged(VpnProtocol::ConnectionState state);