added models, classes and ui files for amnezia wireguard
This commit is contained in:
parent
d4d6fbab88
commit
6afdd8375d
26 changed files with 534 additions and 60 deletions
|
@ -263,6 +263,7 @@ if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.h
|
${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.h
|
${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.h
|
${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/protocols/amneziawireguardprotocol.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SOURCES ${SOURCES}
|
set(SOURCES ${SOURCES}
|
||||||
|
@ -273,6 +274,7 @@ if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.cpp
|
${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.cpp
|
${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.cpp
|
${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/protocols/amneziawireguardprotocol.cpp
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -318,8 +318,11 @@ void AmneziaApplication::initModels()
|
||||||
m_cloakConfigModel.reset(new CloakConfigModel(this));
|
m_cloakConfigModel.reset(new CloakConfigModel(this));
|
||||||
m_engine->rootContext()->setContextProperty("CloakConfigModel", m_cloakConfigModel.get());
|
m_engine->rootContext()->setContextProperty("CloakConfigModel", m_cloakConfigModel.get());
|
||||||
|
|
||||||
m_wireguardConfigModel.reset(new WireGuardConfigModel(this));
|
m_wireGuardConfigModel.reset(new WireGuardConfigModel(this));
|
||||||
m_engine->rootContext()->setContextProperty("WireGuardConfigModel", m_wireguardConfigModel.get());
|
m_engine->rootContext()->setContextProperty("WireGuardConfigModel", m_wireGuardConfigModel.get());
|
||||||
|
|
||||||
|
m_amneziaWireGuardConfigModel.reset(new AmneziaWireGuardConfigModel(this));
|
||||||
|
m_engine->rootContext()->setContextProperty("AmneziaWireGuardConfigModel", m_amneziaWireGuardConfigModel.get());
|
||||||
|
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
m_ikev2ConfigModel.reset(new Ikev2ConfigModel(this));
|
m_ikev2ConfigModel.reset(new Ikev2ConfigModel(this));
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
#include "ui/models/protocols/ikev2ConfigModel.h"
|
#include "ui/models/protocols/ikev2ConfigModel.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "ui/models/protocols/amneziaWireGuardConfigModel.h"
|
||||||
#include "ui/models/protocols/openvpnConfigModel.h"
|
#include "ui/models/protocols/openvpnConfigModel.h"
|
||||||
#include "ui/models/protocols/shadowsocksConfigModel.h"
|
#include "ui/models/protocols/shadowsocksConfigModel.h"
|
||||||
#include "ui/models/protocols/wireguardConfigModel.h"
|
#include "ui/models/protocols/wireguardConfigModel.h"
|
||||||
|
@ -97,7 +98,8 @@ private:
|
||||||
QScopedPointer<OpenVpnConfigModel> m_openVpnConfigModel;
|
QScopedPointer<OpenVpnConfigModel> m_openVpnConfigModel;
|
||||||
QScopedPointer<ShadowSocksConfigModel> m_shadowSocksConfigModel;
|
QScopedPointer<ShadowSocksConfigModel> m_shadowSocksConfigModel;
|
||||||
QScopedPointer<CloakConfigModel> m_cloakConfigModel;
|
QScopedPointer<CloakConfigModel> m_cloakConfigModel;
|
||||||
QScopedPointer<WireGuardConfigModel> m_wireguardConfigModel;
|
QScopedPointer<WireGuardConfigModel> m_wireGuardConfigModel;
|
||||||
|
QScopedPointer<AmneziaWireGuardConfigModel> m_amneziaWireGuardConfigModel;
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
QScopedPointer<Ikev2ConfigModel> m_ikev2ConfigModel;
|
QScopedPointer<Ikev2ConfigModel> m_ikev2ConfigModel;
|
||||||
#endif
|
#endif
|
||||||
|
|
15
client/configurators/amneziaWireGuardConfigurator.cpp
Normal file
15
client/configurators/amneziaWireGuardConfigurator.cpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include "amneziaWireGuardConfigurator.h"
|
||||||
|
|
||||||
|
AmneziaWireGuardConfigurator::AmneziaWireGuardConfigurator(std::shared_ptr<Settings> settings, QObject *parent)
|
||||||
|
: WireguardConfigurator(settings, parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AmneziaWireGuardConfigurator::genAmneziaWireGuardConfig(const ServerCredentials &credentials,
|
||||||
|
DockerContainer container,
|
||||||
|
const QJsonObject &containerConfig, ErrorCode *errorCode)
|
||||||
|
{
|
||||||
|
auto config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
18
client/configurators/amneziaWireGuardConfigurator.h
Normal file
18
client/configurators/amneziaWireGuardConfigurator.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef AMNEZIAWIREGUARDCONFIGURATOR_H
|
||||||
|
#define AMNEZIAWIREGUARDCONFIGURATOR_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "wireguard_configurator.h"
|
||||||
|
|
||||||
|
class AmneziaWireGuardConfigurator : public WireguardConfigurator
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
AmneziaWireGuardConfigurator(std::shared_ptr<Settings> settings, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
QString genAmneziaWireGuardConfig(const ServerCredentials &credentials, DockerContainer container,
|
||||||
|
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AMNEZIAWIREGUARDCONFIGURATOR_H
|
|
@ -1,21 +1,21 @@
|
||||||
#include "vpn_configurator.h"
|
#include "vpn_configurator.h"
|
||||||
#include "openvpn_configurator.h"
|
|
||||||
#include "cloak_configurator.h"
|
#include "cloak_configurator.h"
|
||||||
#include "shadowsocks_configurator.h"
|
|
||||||
#include "wireguard_configurator.h"
|
|
||||||
#include "ikev2_configurator.h"
|
#include "ikev2_configurator.h"
|
||||||
|
#include "openvpn_configurator.h"
|
||||||
|
#include "shadowsocks_configurator.h"
|
||||||
#include "ssh_configurator.h"
|
#include "ssh_configurator.h"
|
||||||
|
#include "wireguard_configurator.h"
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
#include "containers/containers_defs.h"
|
#include "containers/containers_defs.h"
|
||||||
#include "utilities.h"
|
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
VpnConfigurator::VpnConfigurator(std::shared_ptr<Settings> settings, QObject *parent):
|
VpnConfigurator::VpnConfigurator(std::shared_ptr<Settings> settings, QObject *parent)
|
||||||
ConfiguratorBase(settings, parent)
|
: ConfiguratorBase(settings, parent)
|
||||||
{
|
{
|
||||||
openVpnConfigurator = std::shared_ptr<OpenVpnConfigurator>(new OpenVpnConfigurator(settings, this));
|
openVpnConfigurator = std::shared_ptr<OpenVpnConfigurator>(new OpenVpnConfigurator(settings, this));
|
||||||
shadowSocksConfigurator = std::shared_ptr<ShadowSocksConfigurator>(new ShadowSocksConfigurator(settings, this));
|
shadowSocksConfigurator = std::shared_ptr<ShadowSocksConfigurator>(new ShadowSocksConfigurator(settings, this));
|
||||||
|
@ -25,8 +25,8 @@ VpnConfigurator::VpnConfigurator(std::shared_ptr<Settings> settings, QObject *pa
|
||||||
sshConfigurator = std::shared_ptr<SshConfigurator>(new SshConfigurator(settings, this));
|
sshConfigurator = std::shared_ptr<SshConfigurator>(new SshConfigurator(settings, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials,
|
QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container,
|
||||||
DockerContainer container, const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode)
|
const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode)
|
||||||
{
|
{
|
||||||
switch (proto) {
|
switch (proto) {
|
||||||
case Proto::OpenVpn:
|
case Proto::OpenVpn:
|
||||||
|
@ -35,17 +35,17 @@ QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentia
|
||||||
case Proto::ShadowSocks:
|
case Proto::ShadowSocks:
|
||||||
return shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, errorCode);
|
return shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, errorCode);
|
||||||
|
|
||||||
case Proto::Cloak:
|
case Proto::Cloak: return cloakConfigurator->genCloakConfig(credentials, container, containerConfig, errorCode);
|
||||||
return cloakConfigurator->genCloakConfig(credentials, container, containerConfig, errorCode);
|
|
||||||
|
|
||||||
case Proto::WireGuard:
|
case Proto::WireGuard:
|
||||||
return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, errorCode);
|
return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, errorCode);
|
||||||
|
|
||||||
case Proto::Ikev2:
|
case Proto::AmneziaWireGuard:
|
||||||
return ikev2Configurator->genIkev2Config(credentials, container, containerConfig, errorCode);
|
return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, errorCode);
|
||||||
|
|
||||||
default:
|
case Proto::Ikev2: return ikev2Configurator->genIkev2Config(credentials, container, containerConfig, errorCode);
|
||||||
return "";
|
|
||||||
|
default: return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +62,8 @@ QPair<QString, QString> VpnConfigurator::getDnsForConfig(int serverIndex)
|
||||||
if (dns.first.isEmpty() || !Utils::checkIPv4Format(dns.first)) {
|
if (dns.first.isEmpty() || !Utils::checkIPv4Format(dns.first)) {
|
||||||
if (useAmneziaDns && m_settings->containers(serverIndex).contains(DockerContainer::Dns)) {
|
if (useAmneziaDns && m_settings->containers(serverIndex).contains(DockerContainer::Dns)) {
|
||||||
dns.first = protocols::dns::amneziaDnsIp;
|
dns.first = protocols::dns::amneziaDnsIp;
|
||||||
}
|
} else
|
||||||
else dns.first = m_settings->primaryDns();
|
dns.first = m_settings->primaryDns();
|
||||||
}
|
}
|
||||||
if (dns.second.isEmpty() || !Utils::checkIPv4Format(dns.second)) {
|
if (dns.second.isEmpty() || !Utils::checkIPv4Format(dns.second)) {
|
||||||
dns.second = m_settings->secondaryDns();
|
dns.second = m_settings->secondaryDns();
|
||||||
|
@ -73,8 +73,8 @@ QPair<QString, QString> VpnConfigurator::getDnsForConfig(int serverIndex)
|
||||||
return dns;
|
return dns;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &VpnConfigurator::processConfigWithDnsSettings(int serverIndex, DockerContainer container,
|
QString &VpnConfigurator::processConfigWithDnsSettings(int serverIndex, DockerContainer container, Proto proto,
|
||||||
Proto proto, QString &config)
|
QString &config)
|
||||||
{
|
{
|
||||||
auto dns = getDnsForConfig(serverIndex);
|
auto dns = getDnsForConfig(serverIndex);
|
||||||
|
|
||||||
|
@ -84,8 +84,8 @@ QString &VpnConfigurator::processConfigWithDnsSettings(int serverIndex, DockerCo
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, DockerContainer container,
|
QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, DockerContainer container, Proto proto,
|
||||||
Proto proto, QString &config)
|
QString &config)
|
||||||
{
|
{
|
||||||
processConfigWithDnsSettings(serverIndex, container, proto, config);
|
processConfigWithDnsSettings(serverIndex, container, proto, config);
|
||||||
|
|
||||||
|
@ -95,8 +95,8 @@ QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, Docker
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &VpnConfigurator::processConfigWithExportSettings(int serverIndex, DockerContainer container,
|
QString &VpnConfigurator::processConfigWithExportSettings(int serverIndex, DockerContainer container, Proto proto,
|
||||||
Proto proto, QString &config)
|
QString &config)
|
||||||
{
|
{
|
||||||
processConfigWithDnsSettings(serverIndex, container, proto, config);
|
processConfigWithDnsSettings(serverIndex, container, proto, config);
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ QString &VpnConfigurator::processConfigWithExportSettings(int serverIndex, Docke
|
||||||
}
|
}
|
||||||
|
|
||||||
void VpnConfigurator::updateContainerConfigAfterInstallation(DockerContainer container, QJsonObject &containerConfig,
|
void VpnConfigurator::updateContainerConfigAfterInstallation(DockerContainer container, QJsonObject &containerConfig,
|
||||||
const QString &stdOut)
|
const QString &stdOut)
|
||||||
{
|
{
|
||||||
Proto mainProto = ContainerProps::defaultProtocol(container);
|
Proto mainProto = ContainerProps::defaultProtocol(container);
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,10 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon
|
||||||
{
|
{
|
||||||
WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys();
|
WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys();
|
||||||
connData.host = credentials.hostName;
|
connData.host = credentials.hostName;
|
||||||
connData.port = containerConfig.value(config_key::port).toString(protocols::wireguard::defaultPort);
|
connData.port = containerConfig.value(config_key::wireguard)
|
||||||
|
.toObject()
|
||||||
|
.value(config_key::port)
|
||||||
|
.toString(protocols::wireguard::defaultPort);
|
||||||
|
|
||||||
if (connData.clientPrivKey.isEmpty() || connData.clientPubKey.isEmpty()) {
|
if (connData.clientPrivKey.isEmpty() || connData.clientPubKey.isEmpty()) {
|
||||||
if (errorCode)
|
if (errorCode)
|
||||||
|
|
|
@ -7,32 +7,32 @@
|
||||||
#include "configurator_base.h"
|
#include "configurator_base.h"
|
||||||
#include "core/defs.h"
|
#include "core/defs.h"
|
||||||
|
|
||||||
class WireguardConfigurator : ConfiguratorBase
|
class WireguardConfigurator : public ConfiguratorBase
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
WireguardConfigurator(std::shared_ptr<Settings> settings, QObject *parent = nullptr);
|
WireguardConfigurator(std::shared_ptr<Settings> settings, QObject *parent = nullptr);
|
||||||
|
|
||||||
struct ConnectionData {
|
struct ConnectionData
|
||||||
|
{
|
||||||
QString clientPrivKey; // client private key
|
QString clientPrivKey; // client private key
|
||||||
QString clientPubKey; // client public key
|
QString clientPubKey; // client public key
|
||||||
QString clientIP; // internal client IP address
|
QString clientIP; // internal client IP address
|
||||||
QString serverPubKey; // tls-auth key
|
QString serverPubKey; // tls-auth key
|
||||||
QString pskKey; // preshared key
|
QString pskKey; // preshared key
|
||||||
QString host; // host ip
|
QString host; // host ip
|
||||||
QString port;
|
QString port;
|
||||||
};
|
};
|
||||||
|
|
||||||
QString genWireguardConfig(const ServerCredentials &credentials, DockerContainer container,
|
QString genWireguardConfig(const ServerCredentials &credentials, DockerContainer container,
|
||||||
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
||||||
|
|
||||||
QString processConfigWithLocalSettings(QString config);
|
QString processConfigWithLocalSettings(QString config);
|
||||||
QString processConfigWithExportSettings(QString config);
|
QString processConfigWithExportSettings(QString config);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConnectionData prepareWireguardConfig(const ServerCredentials &credentials,
|
ConnectionData prepareWireguardConfig(const ServerCredentials &credentials, DockerContainer container,
|
||||||
DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
||||||
|
|
||||||
ConnectionData genClientKeys();
|
ConnectionData genClientKeys();
|
||||||
};
|
};
|
||||||
|
|
|
@ -84,6 +84,7 @@ QMap<DockerContainer, QString> ContainerProps::containerHumanNames()
|
||||||
{ DockerContainer::ShadowSocks, "ShadowSocks" },
|
{ DockerContainer::ShadowSocks, "ShadowSocks" },
|
||||||
{ DockerContainer::Cloak, "OpenVPN over Cloak" },
|
{ DockerContainer::Cloak, "OpenVPN over Cloak" },
|
||||||
{ DockerContainer::WireGuard, "WireGuard" },
|
{ DockerContainer::WireGuard, "WireGuard" },
|
||||||
|
{ DockerContainer::AmneziaWireGuard, "Amnezia WireGuard" },
|
||||||
{ DockerContainer::Ipsec, QObject::tr("IPsec") },
|
{ DockerContainer::Ipsec, QObject::tr("IPsec") },
|
||||||
|
|
||||||
{ DockerContainer::TorWebSite, QObject::tr("Website in Tor network") },
|
{ DockerContainer::TorWebSite, QObject::tr("Website in Tor network") },
|
||||||
|
@ -107,6 +108,9 @@ QMap<DockerContainer, QString> ContainerProps::containerDescriptions()
|
||||||
{ DockerContainer::WireGuard,
|
{ DockerContainer::WireGuard,
|
||||||
QObject::tr("WireGuard - New popular VPN protocol with high performance, high speed and low power "
|
QObject::tr("WireGuard - New popular VPN protocol with high performance, high speed and low power "
|
||||||
"consumption. Recommended for regions with low levels of censorship.") },
|
"consumption. Recommended for regions with low levels of censorship.") },
|
||||||
|
{ DockerContainer::AmneziaWireGuard,
|
||||||
|
QObject::tr("WireGuard - New popular VPN protocol with high performance, high speed and low power "
|
||||||
|
"consumption. Recommended for regions with low levels of censorship.") },
|
||||||
{ DockerContainer::Ipsec,
|
{ DockerContainer::Ipsec,
|
||||||
QObject::tr("IKEv2 - Modern stable protocol, a bit faster than others, restores connection after "
|
QObject::tr("IKEv2 - Modern stable protocol, a bit faster than others, restores connection after "
|
||||||
"signal loss. It has native support on the latest versions of Android and iOS.") },
|
"signal loss. It has native support on the latest versions of Android and iOS.") },
|
||||||
|
@ -127,6 +131,7 @@ QMap<DockerContainer, QString> ContainerProps::containerDetailedDescriptions()
|
||||||
QObject::tr("Container with OpenVpn and ShadowSocks protocols "
|
QObject::tr("Container with OpenVpn and ShadowSocks protocols "
|
||||||
"configured with traffic masking by Cloak plugin") },
|
"configured with traffic masking by Cloak plugin") },
|
||||||
{ DockerContainer::WireGuard, QObject::tr("WireGuard container") },
|
{ DockerContainer::WireGuard, QObject::tr("WireGuard container") },
|
||||||
|
{ DockerContainer::WireGuard, QObject::tr("Amnezia WireGuard container") },
|
||||||
{ DockerContainer::Ipsec, QObject::tr("IPsec container") },
|
{ DockerContainer::Ipsec, QObject::tr("IPsec container") },
|
||||||
|
|
||||||
{ DockerContainer::TorWebSite, QObject::tr("Website in Tor network") },
|
{ DockerContainer::TorWebSite, QObject::tr("Website in Tor network") },
|
||||||
|
@ -143,6 +148,7 @@ amnezia::ServiceType ContainerProps::containerService(DockerContainer c)
|
||||||
case DockerContainer::Cloak: return ServiceType::Vpn;
|
case DockerContainer::Cloak: return ServiceType::Vpn;
|
||||||
case DockerContainer::ShadowSocks: return ServiceType::Vpn;
|
case DockerContainer::ShadowSocks: return ServiceType::Vpn;
|
||||||
case DockerContainer::WireGuard: return ServiceType::Vpn;
|
case DockerContainer::WireGuard: return ServiceType::Vpn;
|
||||||
|
case DockerContainer::AmneziaWireGuard: return ServiceType::Vpn;
|
||||||
case DockerContainer::Ipsec: return ServiceType::Vpn;
|
case DockerContainer::Ipsec: return ServiceType::Vpn;
|
||||||
case DockerContainer::TorWebSite: return ServiceType::Other;
|
case DockerContainer::TorWebSite: return ServiceType::Other;
|
||||||
case DockerContainer::Dns: return ServiceType::Other;
|
case DockerContainer::Dns: return ServiceType::Other;
|
||||||
|
@ -160,6 +166,7 @@ Proto ContainerProps::defaultProtocol(DockerContainer c)
|
||||||
case DockerContainer::Cloak: return Proto::Cloak;
|
case DockerContainer::Cloak: return Proto::Cloak;
|
||||||
case DockerContainer::ShadowSocks: return Proto::ShadowSocks;
|
case DockerContainer::ShadowSocks: return Proto::ShadowSocks;
|
||||||
case DockerContainer::WireGuard: return Proto::WireGuard;
|
case DockerContainer::WireGuard: return Proto::WireGuard;
|
||||||
|
case DockerContainer::AmneziaWireGuard: return Proto::AmneziaWireGuard;
|
||||||
case DockerContainer::Ipsec: return Proto::Ikev2;
|
case DockerContainer::Ipsec: return Proto::Ikev2;
|
||||||
|
|
||||||
case DockerContainer::TorWebSite: return Proto::TorWebSite;
|
case DockerContainer::TorWebSite: return Proto::TorWebSite;
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace amnezia
|
||||||
ShadowSocks,
|
ShadowSocks,
|
||||||
Cloak,
|
Cloak,
|
||||||
WireGuard,
|
WireGuard,
|
||||||
|
AmneziaWireGuard,
|
||||||
Ipsec,
|
Ipsec,
|
||||||
|
|
||||||
// non-vpn
|
// non-vpn
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "scripts_registry.h"
|
#include "scripts_registry.h"
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
QString amnezia::scriptFolder(amnezia::DockerContainer container)
|
QString amnezia::scriptFolder(amnezia::DockerContainer container)
|
||||||
{
|
{
|
||||||
|
@ -11,11 +11,12 @@ QString amnezia::scriptFolder(amnezia::DockerContainer container)
|
||||||
case DockerContainer::Cloak: return QLatin1String("openvpn_cloak");
|
case DockerContainer::Cloak: return QLatin1String("openvpn_cloak");
|
||||||
case DockerContainer::ShadowSocks: return QLatin1String("openvpn_shadowsocks");
|
case DockerContainer::ShadowSocks: return QLatin1String("openvpn_shadowsocks");
|
||||||
case DockerContainer::WireGuard: return QLatin1String("wireguard");
|
case DockerContainer::WireGuard: return QLatin1String("wireguard");
|
||||||
|
case DockerContainer::AmneziaWireGuard: return QLatin1String("wireguard");
|
||||||
case DockerContainer::Ipsec: return QLatin1String("ipsec");
|
case DockerContainer::Ipsec: return QLatin1String("ipsec");
|
||||||
|
|
||||||
case DockerContainer::TorWebSite: return QLatin1String("website_tor");
|
case DockerContainer::TorWebSite: return QLatin1String("website_tor");
|
||||||
case DockerContainer::Dns: return QLatin1String("dns");
|
case DockerContainer::Dns: return QLatin1String("dns");
|
||||||
//case DockerContainer::FileShare: return QLatin1String("file_share");
|
// case DockerContainer::FileShare: return QLatin1String("file_share");
|
||||||
case DockerContainer::Sftp: return QLatin1String("sftp");
|
case DockerContainer::Sftp: return QLatin1String("sftp");
|
||||||
default: return "";
|
default: return "";
|
||||||
}
|
}
|
||||||
|
@ -52,7 +53,7 @@ QString amnezia::scriptData(amnezia::SharedScriptType type)
|
||||||
{
|
{
|
||||||
QString fileName = QString(":/server_scripts/%1").arg(amnezia::scriptName(type));
|
QString fileName = QString(":/server_scripts/%1").arg(amnezia::scriptName(type));
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
if (! file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
qDebug() << "Warning: script missing" << fileName;
|
qDebug() << "Warning: script missing" << fileName;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -67,7 +68,7 @@ QString amnezia::scriptData(amnezia::ProtocolScriptType type, DockerContainer co
|
||||||
{
|
{
|
||||||
QString fileName = QString(":/server_scripts/%1/%2").arg(amnezia::scriptFolder(container), amnezia::scriptName(type));
|
QString fileName = QString(":/server_scripts/%1/%2").arg(amnezia::scriptFolder(container), amnezia::scriptName(type));
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
if (! file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
qDebug() << "Warning: script missing" << fileName;
|
qDebug() << "Warning: script missing" << fileName;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
|
@ -486,6 +486,8 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential
|
||||||
const QJsonObject &cloakConfig = config.value(ProtocolProps::protoToString(Proto::Cloak)).toObject();
|
const QJsonObject &cloakConfig = config.value(ProtocolProps::protoToString(Proto::Cloak)).toObject();
|
||||||
const QJsonObject &ssConfig = config.value(ProtocolProps::protoToString(Proto::ShadowSocks)).toObject();
|
const QJsonObject &ssConfig = config.value(ProtocolProps::protoToString(Proto::ShadowSocks)).toObject();
|
||||||
const QJsonObject &wireguarConfig = config.value(ProtocolProps::protoToString(Proto::WireGuard)).toObject();
|
const QJsonObject &wireguarConfig = config.value(ProtocolProps::protoToString(Proto::WireGuard)).toObject();
|
||||||
|
const QJsonObject &amneziaWireguarConfig =
|
||||||
|
config.value(ProtocolProps::protoToString(Proto::AmneziaWireGuard)).toObject();
|
||||||
const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject();
|
const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject();
|
||||||
|
|
||||||
Vars vars;
|
Vars vars;
|
||||||
|
|
10
client/protocols/amneziaWireGuardProtocol.cpp
Normal file
10
client/protocols/amneziaWireGuardProtocol.cpp
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include "amneziaWireGuardProtocol.h"
|
||||||
|
|
||||||
|
AmneziaWireGuardProtocol::AmneziaWireGuardProtocol(const QJsonObject &configuration, QObject *parent)
|
||||||
|
: WireguardProtocol(configuration, parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
AmneziaWireGuardProtocol::~AmneziaWireGuardProtocol()
|
||||||
|
{
|
||||||
|
}
|
17
client/protocols/amneziaWireGuardProtocol.h
Normal file
17
client/protocols/amneziaWireGuardProtocol.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef AMNEZIAWIREGUARDPROTOCOL_H
|
||||||
|
#define AMNEZIAWIREGUARDPROTOCOL_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "wireguardprotocol.h"
|
||||||
|
|
||||||
|
class AmneziaWireGuardProtocol : public WireguardProtocol
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AmneziaWireGuardProtocol(const QJsonObject &configuration, QObject *parent = nullptr);
|
||||||
|
virtual ~AmneziaWireGuardProtocol() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AMNEZIAWIREGUARDPROTOCOL_H
|
|
@ -66,6 +66,7 @@ QMap<amnezia::Proto, QString> ProtocolProps::protocolHumanNames()
|
||||||
{ Proto::ShadowSocks, "ShadowSocks" },
|
{ Proto::ShadowSocks, "ShadowSocks" },
|
||||||
{ Proto::Cloak, "Cloak" },
|
{ Proto::Cloak, "Cloak" },
|
||||||
{ Proto::WireGuard, "WireGuard" },
|
{ Proto::WireGuard, "WireGuard" },
|
||||||
|
{ Proto::WireGuard, "Amnezia WireGuard" },
|
||||||
{ Proto::Ikev2, "IKEv2" },
|
{ Proto::Ikev2, "IKEv2" },
|
||||||
{ Proto::L2tp, "L2TP" },
|
{ Proto::L2tp, "L2TP" },
|
||||||
|
|
||||||
|
@ -88,6 +89,7 @@ amnezia::ServiceType ProtocolProps::protocolService(Proto p)
|
||||||
case Proto::Cloak: return ServiceType::Vpn;
|
case Proto::Cloak: return ServiceType::Vpn;
|
||||||
case Proto::ShadowSocks: return ServiceType::Vpn;
|
case Proto::ShadowSocks: return ServiceType::Vpn;
|
||||||
case Proto::WireGuard: return ServiceType::Vpn;
|
case Proto::WireGuard: return ServiceType::Vpn;
|
||||||
|
case Proto::AmneziaWireGuard: return ServiceType::Vpn;
|
||||||
case Proto::TorWebSite: return ServiceType::Other;
|
case Proto::TorWebSite: return ServiceType::Other;
|
||||||
case Proto::Dns: return ServiceType::Other;
|
case Proto::Dns: return ServiceType::Other;
|
||||||
case Proto::FileShare: return ServiceType::Other;
|
case Proto::FileShare: return ServiceType::Other;
|
||||||
|
@ -103,6 +105,7 @@ int ProtocolProps::defaultPort(Proto p)
|
||||||
case Proto::Cloak: return 443;
|
case Proto::Cloak: return 443;
|
||||||
case Proto::ShadowSocks: return 6789;
|
case Proto::ShadowSocks: return 6789;
|
||||||
case Proto::WireGuard: return 51820;
|
case Proto::WireGuard: return 51820;
|
||||||
|
case Proto::AmneziaWireGuard: return 55424;
|
||||||
case Proto::Ikev2: return -1;
|
case Proto::Ikev2: return -1;
|
||||||
case Proto::L2tp: return -1;
|
case Proto::L2tp: return -1;
|
||||||
|
|
||||||
|
@ -122,6 +125,7 @@ bool ProtocolProps::defaultPortChangeable(Proto p)
|
||||||
case Proto::Cloak: return true;
|
case Proto::Cloak: return true;
|
||||||
case Proto::ShadowSocks: return true;
|
case Proto::ShadowSocks: return true;
|
||||||
case Proto::WireGuard: return true;
|
case Proto::WireGuard: return true;
|
||||||
|
case Proto::AmneziaWireGuard: return true;
|
||||||
case Proto::Ikev2: return false;
|
case Proto::Ikev2: return false;
|
||||||
case Proto::L2tp: return false;
|
case Proto::L2tp: return false;
|
||||||
|
|
||||||
|
@ -140,6 +144,7 @@ TransportProto ProtocolProps::defaultTransportProto(Proto p)
|
||||||
case Proto::Cloak: return TransportProto::Tcp;
|
case Proto::Cloak: return TransportProto::Tcp;
|
||||||
case Proto::ShadowSocks: return TransportProto::Tcp;
|
case Proto::ShadowSocks: return TransportProto::Tcp;
|
||||||
case Proto::WireGuard: return TransportProto::Udp;
|
case Proto::WireGuard: return TransportProto::Udp;
|
||||||
|
case Proto::AmneziaWireGuard: return TransportProto::Udp;
|
||||||
case Proto::Ikev2: return TransportProto::Udp;
|
case Proto::Ikev2: return TransportProto::Udp;
|
||||||
case Proto::L2tp: return TransportProto::Udp;
|
case Proto::L2tp: return TransportProto::Udp;
|
||||||
// non-vpn
|
// non-vpn
|
||||||
|
@ -158,6 +163,7 @@ bool ProtocolProps::defaultTransportProtoChangeable(Proto p)
|
||||||
case Proto::Cloak: return false;
|
case Proto::Cloak: return false;
|
||||||
case Proto::ShadowSocks: return false;
|
case Proto::ShadowSocks: return false;
|
||||||
case Proto::WireGuard: return false;
|
case Proto::WireGuard: return false;
|
||||||
|
case Proto::AmneziaWireGuard: return false;
|
||||||
case Proto::Ikev2: return false;
|
case Proto::Ikev2: return false;
|
||||||
case Proto::L2tp: return false;
|
case Proto::L2tp: return false;
|
||||||
// non-vpn
|
// non-vpn
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
#define PROTOCOLS_DEFS_H
|
#define PROTOCOLS_DEFS_H
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QObject>
|
|
||||||
#include <QMetaEnum>
|
#include <QMetaEnum>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
namespace amnezia
|
namespace amnezia
|
||||||
{
|
{
|
||||||
|
@ -158,6 +158,7 @@ namespace amnezia
|
||||||
ShadowSocks,
|
ShadowSocks,
|
||||||
Cloak,
|
Cloak,
|
||||||
WireGuard,
|
WireGuard,
|
||||||
|
AmneziaWireGuard,
|
||||||
Ikev2,
|
Ikev2,
|
||||||
L2tp,
|
L2tp,
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#include "vpnprotocol.h"
|
|
||||||
#include "core/errorstrings.h"
|
#include "core/errorstrings.h"
|
||||||
|
#include "vpnprotocol.h"
|
||||||
|
|
||||||
#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
|
#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
|
||||||
#include "openvpnprotocol.h"
|
#include "openvpnovercloakprotocol.h"
|
||||||
#include "shadowsocksvpnprotocol.h"
|
#include "openvpnprotocol.h"
|
||||||
#include "openvpnovercloakprotocol.h"
|
#include "shadowsocksvpnprotocol.h"
|
||||||
#include "wireguardprotocol.h"
|
#include "wireguardprotocol.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
#include "ikev2_vpn_protocol_windows.h"
|
#include "ikev2_vpn_protocol_windows.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject *parent)
|
||||||
VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject* parent)
|
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
m_connectionState(Vpn::ConnectionState::Unknown),
|
m_connectionState(Vpn::ConnectionState::Unknown),
|
||||||
m_rawConfig(configuration),
|
m_rawConfig(configuration),
|
||||||
|
@ -31,7 +30,7 @@ VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject* parent)
|
||||||
void VpnProtocol::setLastError(ErrorCode lastError)
|
void VpnProtocol::setLastError(ErrorCode lastError)
|
||||||
{
|
{
|
||||||
m_lastError = lastError;
|
m_lastError = lastError;
|
||||||
if (lastError){
|
if (lastError) {
|
||||||
setConnectionState(Vpn::ConnectionState::Error);
|
setConnectionState(Vpn::ConnectionState::Error);
|
||||||
}
|
}
|
||||||
qCritical().noquote() << "VpnProtocol error, code" << m_lastError << errorString(m_lastError);
|
qCritical().noquote() << "VpnProtocol error, code" << m_lastError << errorString(m_lastError);
|
||||||
|
@ -103,7 +102,7 @@ QString VpnProtocol::vpnGateway() const
|
||||||
return m_vpnGateway;
|
return m_vpnGateway;
|
||||||
}
|
}
|
||||||
|
|
||||||
VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject& configuration)
|
VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject &configuration)
|
||||||
{
|
{
|
||||||
switch (container) {
|
switch (container) {
|
||||||
#if defined(Q_OS_WINDOWS)
|
#if defined(Q_OS_WINDOWS)
|
||||||
|
@ -114,6 +113,7 @@ VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject&
|
||||||
case DockerContainer::Cloak: return new OpenVpnOverCloakProtocol(configuration);
|
case DockerContainer::Cloak: return new OpenVpnOverCloakProtocol(configuration);
|
||||||
case DockerContainer::ShadowSocks: return new ShadowSocksVpnProtocol(configuration);
|
case DockerContainer::ShadowSocks: return new ShadowSocksVpnProtocol(configuration);
|
||||||
case DockerContainer::WireGuard: return new WireguardProtocol(configuration);
|
case DockerContainer::WireGuard: return new WireguardProtocol(configuration);
|
||||||
|
case DockerContainer::AmneziaWireGuard: return new WireguardProtocol(configuration);
|
||||||
#endif
|
#endif
|
||||||
default: return nullptr;
|
default: return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -135,8 +135,7 @@ QString VpnProtocol::textConnectionState(Vpn::ConnectionState connectionState)
|
||||||
case Vpn::ConnectionState::Disconnecting: return tr("Disconnecting...");
|
case Vpn::ConnectionState::Disconnecting: return tr("Disconnecting...");
|
||||||
case Vpn::ConnectionState::Reconnecting: return tr("Reconnecting...");
|
case Vpn::ConnectionState::Reconnecting: return tr("Reconnecting...");
|
||||||
case Vpn::ConnectionState::Error: return tr("Error");
|
case Vpn::ConnectionState::Error: return tr("Error");
|
||||||
default:
|
default:;
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return QString();
|
return QString();
|
||||||
|
|
|
@ -18,7 +18,7 @@ WireguardProtocol::WireguardProtocol(const QJsonObject &configuration, QObject *
|
||||||
|
|
||||||
// MZ
|
// MZ
|
||||||
#if defined(MZ_LINUX)
|
#if defined(MZ_LINUX)
|
||||||
//m_impl.reset(new LinuxController());
|
// m_impl.reset(new LinuxController());
|
||||||
#elif defined(Q_OS_MAC) || defined(Q_OS_WIN)
|
#elif defined(Q_OS_MAC) || defined(Q_OS_WIN)
|
||||||
m_impl.reset(new LocalSocketController());
|
m_impl.reset(new LocalSocketController());
|
||||||
connect(m_impl.get(), &ControllerImpl::connected, this,
|
connect(m_impl.get(), &ControllerImpl::connected, this,
|
||||||
|
|
|
@ -215,5 +215,6 @@
|
||||||
<file>ui/qml/Controls2/ListViewWithLabelsType.qml</file>
|
<file>ui/qml/Controls2/ListViewWithLabelsType.qml</file>
|
||||||
<file>ui/qml/Pages2/PageServiceDnsSettings.qml</file>
|
<file>ui/qml/Pages2/PageServiceDnsSettings.qml</file>
|
||||||
<file>ui/qml/Controls2/TopCloseButtonType.qml</file>
|
<file>ui/qml/Controls2/TopCloseButtonType.qml</file>
|
||||||
|
<file>ui/qml/Pages2/PageProtocolAmneziaWireGuardSettings.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
|
@ -49,6 +49,7 @@ namespace PageLoader
|
||||||
PageProtocolShadowSocksSettings,
|
PageProtocolShadowSocksSettings,
|
||||||
PageProtocolCloakSettings,
|
PageProtocolCloakSettings,
|
||||||
PageProtocolWireGuardSettings,
|
PageProtocolWireGuardSettings,
|
||||||
|
PageProtocolAmneziaWireGuardSettings,
|
||||||
PageProtocolIKev2Settings,
|
PageProtocolIKev2Settings,
|
||||||
PageProtocolRaw
|
PageProtocolRaw
|
||||||
};
|
};
|
||||||
|
|
70
client/ui/models/protocols/amneziaWireGuardConfigModel.cpp
Normal file
70
client/ui/models/protocols/amneziaWireGuardConfigModel.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
#include "amneziaWireGuardConfigModel.h"
|
||||||
|
|
||||||
|
#include "protocols/protocols_defs.h"
|
||||||
|
|
||||||
|
AmneziaWireGuardConfigModel::AmneziaWireGuardConfigModel(QObject *parent) : QAbstractListModel(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int AmneziaWireGuardConfigModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AmneziaWireGuardConfigModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() < 0 || index.row() >= ContainerProps::allContainers().size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (role) {
|
||||||
|
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break;
|
||||||
|
case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit dataChanged(index, index, QList { role });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant AmneziaWireGuardConfigModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() < 0 || index.row() >= rowCount()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (role) {
|
||||||
|
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort);
|
||||||
|
case Roles::CipherRole:
|
||||||
|
return m_protocolConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher);
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AmneziaWireGuardConfigModel::updateModel(const QJsonObject &config)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString());
|
||||||
|
|
||||||
|
m_fullConfig = config;
|
||||||
|
QJsonObject protocolConfig = config.value(config_key::wireguard).toObject();
|
||||||
|
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject AmneziaWireGuardConfigModel::getConfig()
|
||||||
|
{
|
||||||
|
m_fullConfig.insert(config_key::wireguard, m_protocolConfig);
|
||||||
|
return m_fullConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> AmneziaWireGuardConfigModel::roleNames() const
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> roles;
|
||||||
|
|
||||||
|
roles[PortRole] = "port";
|
||||||
|
roles[CipherRole] = "cipher";
|
||||||
|
|
||||||
|
return roles;
|
||||||
|
}
|
39
client/ui/models/protocols/amneziaWireGuardConfigModel.h
Normal file
39
client/ui/models/protocols/amneziaWireGuardConfigModel.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#ifndef AMNEZIAWIREGUARDCONFIGMODEL_H
|
||||||
|
#define AMNEZIAWIREGUARDCONFIGMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
|
#include "containers/containers_defs.h"
|
||||||
|
|
||||||
|
class AmneziaWireGuardConfigModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Roles {
|
||||||
|
PortRole = Qt::UserRole + 1,
|
||||||
|
CipherRole
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit AmneziaWireGuardConfigModel(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||||
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void updateModel(const QJsonObject &config);
|
||||||
|
QJsonObject getConfig();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DockerContainer m_container;
|
||||||
|
QJsonObject m_protocolConfig;
|
||||||
|
QJsonObject m_fullConfig;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AMNEZIAWIREGUARDCONFIGMODEL_H
|
|
@ -72,8 +72,7 @@ ListView {
|
||||||
containersDropDown.menuVisible = false
|
containersDropDown.menuVisible = false
|
||||||
|
|
||||||
|
|
||||||
if (needReconnected &&
|
if (needReconnected && (ConnectionController.isConnected || ConnectionController.isConnectionInProgress)) {
|
||||||
(ConnectionController.isConnected || ConnectionController.isConnectionInProgress)) {
|
|
||||||
PageController.showNotificationMessage(qsTr("Reconnect via VPN Procotol: ") + name)
|
PageController.showNotificationMessage(qsTr("Reconnect via VPN Procotol: ") + name)
|
||||||
PageController.goToPageHome()
|
PageController.goToPageHome()
|
||||||
menu.visible = false
|
menu.visible = false
|
||||||
|
|
|
@ -64,6 +64,11 @@ ListView {
|
||||||
// goToPage(PageEnum.PageProtocolWireGuardSettings)
|
// goToPage(PageEnum.PageProtocolWireGuardSettings)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
case ContainerEnum.AmneziaWireGuard: {
|
||||||
|
WireGuardConfigModel.updateModel(config)
|
||||||
|
PageController.goToPage(PageEnum.PageProtocolAmneziaWireGuardSettings)
|
||||||
|
break
|
||||||
|
}
|
||||||
case ContainerEnum.Ipsec: {
|
case ContainerEnum.Ipsec: {
|
||||||
ProtocolsModel.updateModel(config)
|
ProtocolsModel.updateModel(config)
|
||||||
PageController.goToPage(PageEnum.PageProtocolRaw)
|
PageController.goToPage(PageEnum.PageProtocolRaw)
|
||||||
|
|
272
client/ui/qml/Pages2/PageProtocolAmneziaWireGuardSettings.qml
Normal file
272
client/ui/qml/Pages2/PageProtocolAmneziaWireGuardSettings.qml
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
import SortFilterProxyModel 0.2
|
||||||
|
|
||||||
|
import "./"
|
||||||
|
import "../Controls2"
|
||||||
|
import "../Controls2/TextTypes"
|
||||||
|
import "../Config"
|
||||||
|
import "../Components"
|
||||||
|
|
||||||
|
PageType {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: backButton
|
||||||
|
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
anchors.topMargin: 20
|
||||||
|
|
||||||
|
BackButtonType {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FlickableType {
|
||||||
|
id: fl
|
||||||
|
anchors.top: backButton.bottom
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
contentHeight: content.implicitHeight
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: content
|
||||||
|
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess()
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listview
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
height: listview.contentItem.height
|
||||||
|
|
||||||
|
clip: true
|
||||||
|
interactive: false
|
||||||
|
|
||||||
|
model: AmneziaWireGuardConfigModel
|
||||||
|
|
||||||
|
delegate: Item {
|
||||||
|
implicitWidth: listview.width
|
||||||
|
implicitHeight: col.implicitHeight
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: col
|
||||||
|
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
anchors.leftMargin: 16
|
||||||
|
anchors.rightMargin: 16
|
||||||
|
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
|
HeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
headerText: qsTr("Amnezia WireGuard settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 40
|
||||||
|
|
||||||
|
headerText: qsTr("Port")
|
||||||
|
textFieldText: port
|
||||||
|
textField.maximumLength: 5
|
||||||
|
textField.validator: IntValidator { bottom: 1; top: 65535 }
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Junk packet count")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Junk packet minimum size")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Junk packet maximum size")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Init packet junk size")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Response packet junk size")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Init packet magic header")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Response packet magic header")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Transport packet magic header")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldWithHeaderType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 16
|
||||||
|
|
||||||
|
headerText: qsTr("Underload packet magic header")
|
||||||
|
textFieldText: port
|
||||||
|
|
||||||
|
textField.onEditingFinished: {
|
||||||
|
if (textFieldText !== port) {
|
||||||
|
port = textFieldText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicButtonType {
|
||||||
|
Layout.topMargin: 24
|
||||||
|
Layout.leftMargin: -8
|
||||||
|
implicitHeight: 32
|
||||||
|
|
||||||
|
defaultColor: "transparent"
|
||||||
|
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
|
||||||
|
pressedColor: Qt.rgba(1, 1, 1, 0.12)
|
||||||
|
textColor: "#EB5757"
|
||||||
|
|
||||||
|
text: qsTr("Remove Amnezia WireGuard")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
questionDrawer.headerText = qsTr("Remove Amnezia WireGuard from server?")
|
||||||
|
questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it")
|
||||||
|
questionDrawer.yesButtonText = qsTr("Continue")
|
||||||
|
questionDrawer.noButtonText = qsTr("Cancel")
|
||||||
|
|
||||||
|
questionDrawer.yesButtonFunction = function() {
|
||||||
|
questionDrawer.visible = false
|
||||||
|
PageController.goToPage(PageEnum.PageDeinstalling)
|
||||||
|
InstallController.removeCurrentlyProcessedContainer()
|
||||||
|
}
|
||||||
|
questionDrawer.noButtonFunction = function() {
|
||||||
|
questionDrawer.visible = false
|
||||||
|
}
|
||||||
|
questionDrawer.visible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicButtonType {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 24
|
||||||
|
Layout.bottomMargin: 24
|
||||||
|
|
||||||
|
text: qsTr("Save and Restart Amnezia")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
forceActiveFocus()
|
||||||
|
// PageController.showBusyIndicator(true)
|
||||||
|
// InstallController.updateContainer(ShadowSocksConfigModel.getConfig())
|
||||||
|
// PageController.showBusyIndicator(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QuestionDrawer {
|
||||||
|
id: questionDrawer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -62,7 +62,7 @@ PageType {
|
||||||
function onInstallationErrorOccurred(errorMessage) {
|
function onInstallationErrorOccurred(errorMessage) {
|
||||||
PageController.showErrorMessage(errorMessage)
|
PageController.showErrorMessage(errorMessage)
|
||||||
|
|
||||||
var currentPageName = tabBarStackView.currentItem.objectName
|
var currentPageName = stackView.currentItem.objectName
|
||||||
|
|
||||||
if (currentPageName === PageController.getPagePath(PageEnum.PageSetupWizardInstalling)) {
|
if (currentPageName === PageController.getPagePath(PageEnum.PageSetupWizardInstalling)) {
|
||||||
PageController.closePage()
|
PageController.closePage()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue