Dns selection implemented

This commit is contained in:
pokamest 2022-02-01 19:48:59 +03:00
parent 5fffb2afe3
commit ad9d45a154
16 changed files with 196 additions and 52 deletions

View file

@ -10,6 +10,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "utils.h"
Settings &VpnConfigurator::m_settings() Settings &VpnConfigurator::m_settings()
{ {
@ -41,24 +42,59 @@ QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentia
} }
} }
QString VpnConfigurator::processConfigWithLocalSettings(DockerContainer container, Proto proto, QString config) QPair<QString, QString> VpnConfigurator::getDnsForConfig(int serverIndex)
{ {
config.replace("$PRIMARY_DNS", m_settings().primaryDns()); QPair<QString, QString> dns;
config.replace("$SECONDARY_DNS", m_settings().secondaryDns());
bool useAmneziaDns = m_settings().useAmneziaDns();
const QJsonObject &server = m_settings().server(serverIndex);
dns.first = server.value(config_key::dns1).toString();
dns.second = server.value(config_key::dns2).toString();
if (dns.first.isEmpty() || !Utils::checkIPv4Format(dns.first)) {
if (useAmneziaDns && m_settings().containers(serverIndex).contains(DockerContainer::Dns)) {
dns.first = protocols::dns::amneziaDnsIp;
}
else dns.first = m_settings().primaryDns();
}
if (dns.second.isEmpty() || !Utils::checkIPv4Format(dns.second)) {
dns.second = m_settings().secondaryDns();
}
qDebug() << "VpnConfigurator::getDnsForConfig" << dns.first << dns.second;
return dns;
}
QString &VpnConfigurator::processConfigWithDnsSettings(int serverIndex, DockerContainer container,
Proto proto, QString &config)
{
auto dns = getDnsForConfig(serverIndex);
config.replace("$PRIMARY_DNS", dns.first);
config.replace("$SECONDARY_DNS", dns.second);
return config;
}
QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, DockerContainer container,
Proto proto, QString &config)
{
processConfigWithDnsSettings(serverIndex, container, proto, config);
if (proto == Proto::OpenVpn) { if (proto == Proto::OpenVpn) {
return OpenVpnConfigurator::processConfigWithLocalSettings(config); config = OpenVpnConfigurator::processConfigWithLocalSettings(config);
} }
return config; return config;
} }
QString VpnConfigurator::processConfigWithExportSettings(DockerContainer container, Proto proto, QString config) QString &VpnConfigurator::processConfigWithExportSettings(int serverIndex, DockerContainer container,
Proto proto, QString &config)
{ {
config.replace("$PRIMARY_DNS", m_settings().primaryDns()); processConfigWithDnsSettings(serverIndex, container, proto, config);
config.replace("$SECONDARY_DNS", m_settings().secondaryDns());
if (proto == Proto::OpenVpn) { if (proto == Proto::OpenVpn) {
return OpenVpnConfigurator::processConfigWithExportSettings(config); config = OpenVpnConfigurator::processConfigWithExportSettings(config);
} }
return config; return config;
} }

View file

@ -15,8 +15,11 @@ public:
static QString genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container, static QString genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container,
const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode = nullptr); const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode = nullptr);
static QString processConfigWithLocalSettings(DockerContainer container, Proto proto, QString config); static QPair<QString, QString> getDnsForConfig(int serverIndex);
static QString processConfigWithExportSettings(DockerContainer container, Proto proto, QString config); static QString &processConfigWithDnsSettings(int serverIndex, DockerContainer container, Proto proto, QString &config);
static QString &processConfigWithLocalSettings(int serverIndex, DockerContainer container, Proto proto, QString &config);
static QString &processConfigWithExportSettings(int serverIndex, DockerContainer container, Proto proto, QString &config);
// workaround for containers which is not support normal configaration // workaround for containers which is not support normal configaration
static void updateContainerConfigAfterInstallation(DockerContainer container, static void updateContainerConfigAfterInstallation(DockerContainer container,

View file

@ -62,6 +62,20 @@ QString Debug::userLogsDir()
return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/log"; return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/log";
} }
QString Debug::userLogsFilePath()
{
return userLogsDir() + QDir::separator() + m_logFileName;
}
QString Debug::getLogs()
{
m_file.flush();
QFile file(userLogsFilePath());
file.open(QIODevice::ReadOnly);
return file.readAll();
}
bool Debug::openLogsFolder() bool Debug::openLogsFolder()
{ {
QString path = userLogsDir(); QString path = userLogsDir();
@ -93,11 +107,7 @@ void Debug::clearLogs()
bool isLogActive = m_file.isOpen(); bool isLogActive = m_file.isOpen();
m_file.close(); m_file.close();
QFile file(userLogsFilePath());
QString path = userLogsDir();
QDir appDir(path);
QFile file;
file.setFileName(appDir.filePath(m_logFileName));
file.open(QIODevice::WriteOnly | QIODevice::Truncate); file.open(QIODevice::WriteOnly | QIODevice::Truncate);
file.resize(0); file.resize(0);

View file

@ -18,6 +18,9 @@ public:
static void clearServiceLogs(); static void clearServiceLogs();
static void cleanUp(); static void cleanUp();
static QString userLogsFilePath();
static QString getLogs();
private: private:
static QString userLogsDir(); static QString userLogsDir();

View file

@ -15,6 +15,10 @@ constexpr char password[] = "password";
constexpr char port[] = "port"; constexpr char port[] = "port";
constexpr char local_port[] = "local_port"; constexpr char local_port[] = "local_port";
constexpr char dns1[] = "dns1";
constexpr char dns2[] = "dns2";
constexpr char description[] = "description"; constexpr char description[] = "description";
constexpr char cert[] = "cert"; constexpr char cert[] = "cert";
constexpr char config[] = "config"; constexpr char config[] = "config";
@ -55,6 +59,9 @@ constexpr char last_config[] = "last_config";
namespace protocols { namespace protocols {
namespace dns {
constexpr char amneziaDnsIp[] = "172.29.172.254";
}
namespace openvpn { namespace openvpn {
constexpr char defaultSubnetAddress[] = "10.8.0.0"; constexpr char defaultSubnetAddress[] = "10.8.0.0";

View file

@ -92,6 +92,8 @@ public:
void addVpnIps(RouteMode mode, const QStringList &ip); void addVpnIps(RouteMode mode, const QStringList &ip);
void removeVpnSites(RouteMode mode, const QStringList &sites); void removeVpnSites(RouteMode mode, const QStringList &sites);
bool useAmneziaDns() const { return m_settings.value("Conf/useAmneziaDns", true).toBool(); }
void setUseAmneziaDns(bool enabled) { m_settings.setValue("Conf/useAmneziaDns", enabled); }
QString primaryDns() const; QString primaryDns() const;
QString secondaryDns() const; QString secondaryDns() const;

View file

@ -4,6 +4,10 @@
#include "defines.h" #include "defines.h"
#include "ui/qautostart.h" #include "ui/qautostart.h"
#include <QDesktopServices>
#include <QFileDialog>
#include <QStandardPaths>
using namespace amnezia; using namespace amnezia;
using namespace PageEnumNS; using namespace PageEnumNS;
@ -61,7 +65,22 @@ void AppSettingsLogic::onPushButtonOpenLogsClicked()
void AppSettingsLogic::onPushButtonExportLogsClicked() void AppSettingsLogic::onPushButtonExportLogsClicked()
{ {
QString log = Debug::getLogs();
QString ext = ".log";
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save log"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*" + ext);
if (fileName.isEmpty()) return;
if (!fileName.endsWith(ext)) fileName.append(ext);
QFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(log.toUtf8());
save.close();
QFileInfo fi(fileName);
QDesktopServices::openUrl(fi.absoluteDir().absolutePath());
} }
void AppSettingsLogic::onPushButtonClearLogsClicked() void AppSettingsLogic::onPushButtonClearLogsClicked()

View file

@ -5,6 +5,7 @@
NetworkSettingsLogic::NetworkSettingsLogic(UiLogic *logic, QObject *parent): NetworkSettingsLogic::NetworkSettingsLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent), PageLogicBase(logic, parent),
m_checkBoxUseAmneziaDnsChecked{false},
m_ipAddressRegex{Utils::ipAddressRegExp()} m_ipAddressRegex{Utils::ipAddressRegExp()}
{ {
@ -12,6 +13,8 @@ NetworkSettingsLogic::NetworkSettingsLogic(UiLogic *logic, QObject *parent):
void NetworkSettingsLogic::onUpdatePage() void NetworkSettingsLogic::onUpdatePage()
{ {
set_checkBoxUseAmneziaDnsChecked(m_settings.useAmneziaDns());
set_lineEditDns1Text(m_settings.primaryDns()); set_lineEditDns1Text(m_settings.primaryDns());
set_lineEditDns2Text(m_settings.secondaryDns()); set_lineEditDns2Text(m_settings.secondaryDns());
} }
@ -41,3 +44,8 @@ void NetworkSettingsLogic::onPushButtonResetDns2Clicked()
m_settings.setSecondaryDns(m_settings.cloudFlareNs2); m_settings.setSecondaryDns(m_settings.cloudFlareNs2);
onUpdatePage(); onUpdatePage();
} }
void NetworkSettingsLogic::onCheckBoxUseAmneziaDnsToggled(bool checked)
{
m_settings.setUseAmneziaDns(checked);
}

View file

@ -9,6 +9,8 @@ class NetworkSettingsLogic : public PageLogicBase
{ {
Q_OBJECT Q_OBJECT
AUTO_PROPERTY(bool, checkBoxUseAmneziaDnsChecked)
AUTO_PROPERTY(QString, lineEditDns1Text) AUTO_PROPERTY(QString, lineEditDns1Text)
AUTO_PROPERTY(QString, lineEditDns2Text) AUTO_PROPERTY(QString, lineEditDns2Text)
READONLY_PROPERTY(QRegExp, ipAddressRegex) READONLY_PROPERTY(QRegExp, ipAddressRegex)
@ -21,6 +23,8 @@ public:
Q_INVOKABLE void onPushButtonResetDns1Clicked(); Q_INVOKABLE void onPushButtonResetDns1Clicked();
Q_INVOKABLE void onPushButtonResetDns2Clicked(); Q_INVOKABLE void onPushButtonResetDns2Clicked();
Q_INVOKABLE void onCheckBoxUseAmneziaDnsToggled(bool checked);
public: public:
explicit NetworkSettingsLogic(UiLogic *uiLogic, QObject *parent = nullptr); explicit NetworkSettingsLogic(UiLogic *uiLogic, QObject *parent = nullptr);
~NetworkSettingsLogic() = default; ~NetworkSettingsLogic() = default;

View file

@ -28,8 +28,8 @@ void ServerSettingsLogic::onUpdatePage()
set_pushButtonClearVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex)); set_pushButtonClearVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex));
set_pushButtonClearClientCacheVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex)); set_pushButtonClearClientCacheVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex));
set_pushButtonShareFullVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex)); set_pushButtonShareFullVisible(m_settings.haveAuthData(uiLogic()->selectedServerIndex));
QJsonObject server = m_settings.server(uiLogic()->selectedServerIndex); const QJsonObject &server = m_settings.server(uiLogic()->selectedServerIndex);
QString port = server.value(config_key::port).toString(); const QString &port = server.value(config_key::port).toString();
set_labelServerText(QString("%1@%2%3%4") set_labelServerText(QString("%1@%2%3%4")
.arg(server.value(config_key::userName).toString()) .arg(server.value(config_key::userName).toString())
.arg(server.value(config_key::hostName).toString()) .arg(server.value(config_key::hostName).toString())

View file

@ -60,21 +60,24 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked()
set_shareAmneziaQrCodeTextSeriesLength(0); set_shareAmneziaQrCodeTextSeriesLength(0);
QJsonObject serverConfig; QJsonObject serverConfig;
int serverIndex = uiLogic()->selectedServerIndex;
DockerContainer container = uiLogic()->selectedDockerContainer;
// Full access // Full access
if (shareFullAccess()) { if (shareFullAccess()) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex); serverConfig = m_settings.server(serverIndex);
} }
// Container share // Container share
else { else {
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex); ServerCredentials credentials = m_settings.serverCredentials(serverIndex);
QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); QJsonObject containerConfig = m_settings.containerConfig(serverIndex, container);
containerConfig.insert(config_key::container, ContainerProps::containerToString(uiLogic()->selectedDockerContainer)); containerConfig.insert(config_key::container, ContainerProps::containerToString(container));
ErrorCode e = ErrorCode::NoError; ErrorCode e = ErrorCode::NoError;
for (Proto p: ContainerProps::protocolsForContainer(uiLogic()->selectedDockerContainer)) { for (Proto p: ContainerProps::protocolsForContainer(container)) {
QJsonObject protoConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p); QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, p);
QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, p, &e); QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, container, containerConfig, p, &e);
if (e) { if (e) {
cfg = "Error generating config"; cfg = "Error generating config";
break; break;
@ -85,12 +88,17 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked()
QByteArray ba; QByteArray ba;
if (!e) { if (!e) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex); serverConfig = m_settings.server(serverIndex);
serverConfig.remove(config_key::userName); serverConfig.remove(config_key::userName);
serverConfig.remove(config_key::password); serverConfig.remove(config_key::password);
serverConfig.remove(config_key::port); serverConfig.remove(config_key::port);
serverConfig.insert(config_key::containers, QJsonArray {containerConfig}); serverConfig.insert(config_key::containers, QJsonArray {containerConfig});
serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(uiLogic()->selectedDockerContainer)); serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(container));
auto dns = VpnConfigurator::getDnsForConfig(serverIndex);
serverConfig.insert(config_key::dns1, dns.first);
serverConfig.insert(config_key::dns2, dns.second);
} }
else { else {
set_textEditShareAmneziaCodeText(tr("Error while generating connection profile")); set_textEditShareAmneziaCodeText(tr("Error while generating connection profile"));
@ -111,12 +119,15 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked()
void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked() void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked()
{ {
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex); int serverIndex = uiLogic()->selectedServerIndex;
const QJsonObject &containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); DockerContainer container = uiLogic()->selectedDockerContainer;
ServerCredentials credentials = m_settings.serverCredentials(serverIndex);
const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container);
ErrorCode e = ErrorCode::NoError; ErrorCode e = ErrorCode::NoError;
QString cfg = OpenVpnConfigurator::genOpenVpnConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, &e); QString cfg = OpenVpnConfigurator::genOpenVpnConfig(credentials, container, containerConfig, &e);
cfg = VpnConfigurator::processConfigWithExportSettings(uiLogic()->selectedDockerContainer, Proto::OpenVpn, cfg); cfg = VpnConfigurator::processConfigWithExportSettings(serverIndex, container, Proto::OpenVpn, cfg);
set_textEditShareOpenVpnCodeText(QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString()); set_textEditShareOpenVpnCodeText(QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString());
} }
@ -202,7 +213,7 @@ void ShareConnectionLogic::onPushButtonShareWireGuardGenerateClicked()
errorString(e)); errorString(e));
return; return;
} }
cfg = VpnConfigurator::processConfigWithExportSettings(container, Proto::WireGuard, cfg); cfg = VpnConfigurator::processConfigWithExportSettings(serverIndex, container, Proto::WireGuard, cfg);
cfg = QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString(); cfg = QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString();
set_textEditShareWireGuardCodeText(cfg); set_textEditShareWireGuardCodeText(cfg);
@ -223,7 +234,7 @@ void ShareConnectionLogic::onPushButtonShareIkev2GenerateClicked()
Ikev2Configurator::ConnectionData connData = Ikev2Configurator::prepareIkev2Config(credentials, container); Ikev2Configurator::ConnectionData connData = Ikev2Configurator::prepareIkev2Config(credentials, container);
QString cfg = Ikev2Configurator::genIkev2Config(connData); QString cfg = Ikev2Configurator::genIkev2Config(connData);
cfg = VpnConfigurator::processConfigWithExportSettings(container, Proto::Ikev2, cfg); cfg = VpnConfigurator::processConfigWithExportSettings(serverIndex, container, Proto::Ikev2, cfg);
cfg = QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::cert].toString(); cfg = QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::cert].toString();
set_textEditShareIkev2CertText(cfg); set_textEditShareIkev2CertText(cfg);

View file

@ -58,9 +58,19 @@ PageBase {
anchors.topMargin: 20 anchors.topMargin: 20
font.pixelSize: 22 font.pixelSize: 22
text: qsTr("Donate") text: qsTr("Donate")
width: undefined
anchors.top: label_support.bottom anchors.top: label_support.bottom
} }
LabelType {
anchors.bottom: caption3.bottom
anchors.left: caption3.right
anchors.leftMargin: 5
font.pixelSize: 24
text: "♥"
color: "red"
}
RichLabelType { RichLabelType {
id: label_donate id: label_donate
anchors.top: caption3.bottom anchors.top: caption3.bottom

View file

@ -17,17 +17,41 @@ PageBase {
id: caption id: caption
text: qsTr("DNS Servers") text: qsTr("DNS Servers")
} }
CheckBoxType {
id: cb_amnezia_dns
anchors.top: caption.bottom
x: 30
width: parent.width - 60
text: qsTr("Use AmneziaDNS service (recommended)")
checked: NetworkSettingsLogic.checkBoxUseAmneziaDnsChecked
onCheckedChanged: {
NetworkSettingsLogic.checkBoxUseAmneziaDnsChecked = checked
NetworkSettingsLogic.onCheckBoxUseAmneziaDnsToggled(checked)
}
}
LabelType {
id: lb_amnezia_dns
x: 30
anchors.top: cb_amnezia_dns.bottom
width: parent.width - 60
text: qsTr("Use AmneziaDNS container on your server, when it installed.\n
Your AmneziaDNS server available only when it installed and VPN connected, it has internal IP address 172.29.172.254\n
If AmneziaDNS service is not installed on the same server, or this option is unchecked, the following DNS servers will be used:")
}
LabelType { LabelType {
id: l1 id: l1
x: 40 x: 30
anchors.top: caption.bottom anchors.top: lb_amnezia_dns.bottom
width: parent.width - 40 width: parent.width - 30
height: 21 height: 21
text: qsTr("Primary DNS server") text: qsTr("Primary DNS server")
} }
TextFieldType { TextFieldType {
id: dns1 id: dns1
x: 40 x: 30
anchors.top: l1.bottom anchors.top: l1.bottom
width: parent.width - 90 width: parent.width - 90
height: 40 height: 40
@ -55,16 +79,16 @@ PageBase {
LabelType { LabelType {
id: l2 id: l2
x: 40 x: 30
anchors.top: dns1.bottom anchors.top: dns1.bottom
anchors.topMargin: 20 anchors.topMargin: 20
width: parent.width - 40 width: parent.width - 60
height: 21 height: 21
text: qsTr("Secondray DNS server") text: qsTr("Secondray DNS server")
} }
TextFieldType { TextFieldType {
id: dns2 id: dns2
x: 40 x: 30
anchors.top: l2.bottom anchors.top: l2.bottom
width: parent.width - 90 width: parent.width - 90
height: 40 height: 40

View file

@ -600,10 +600,11 @@ PageEnumNS::Page UiLogic::currentPage()
return static_cast<PageEnumNS::Page>(currentPageValue()); return static_cast<PageEnumNS::Page>(currentPageValue());
} }
void UiLogic::saveTextFile(const QString& desc, const QString& ext, const QString& data) void UiLogic::saveTextFile(const QString& desc, QString ext, const QString& data)
{ {
ext.replace("*", "");
QString fileName = QFileDialog::getSaveFileName(nullptr, desc, QString fileName = QFileDialog::getSaveFileName(nullptr, desc,
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), ext); QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*" + ext);
if (fileName.isEmpty()) return; if (fileName.isEmpty()) return;
if (!fileName.endsWith(ext)) fileName.append(ext); if (!fileName.endsWith(ext)) fileName.append(ext);
@ -617,10 +618,11 @@ void UiLogic::saveTextFile(const QString& desc, const QString& ext, const QStrin
QDesktopServices::openUrl(fi.absoluteDir().absolutePath()); QDesktopServices::openUrl(fi.absoluteDir().absolutePath());
} }
void UiLogic::saveBinaryFile(const QString &desc, const QString &ext, const QString &data) void UiLogic::saveBinaryFile(const QString &desc, QString ext, const QString &data)
{ {
ext.replace("*", "");
QString fileName = QFileDialog::getSaveFileName(nullptr, desc, QString fileName = QFileDialog::getSaveFileName(nullptr, desc,
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), ext); QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*" + ext);
if (fileName.isEmpty()) return; if (fileName.isEmpty()) return;
if (!fileName.endsWith(ext)) fileName.append(ext); if (!fileName.endsWith(ext)) fileName.append(ext);

View file

@ -100,8 +100,8 @@ public:
Q_INVOKABLE void keyPressEvent(Qt::Key key); Q_INVOKABLE void keyPressEvent(Qt::Key key);
Q_INVOKABLE void saveTextFile(const QString& desc, const QString& ext, const QString& data); Q_INVOKABLE void saveTextFile(const QString& desc, QString ext, const QString& data);
Q_INVOKABLE void saveBinaryFile(const QString& desc, const QString& ext, const QString& data); Q_INVOKABLE void saveBinaryFile(const QString& desc, QString ext, const QString& data);
Q_INVOKABLE void copyToClipboard(const QString& text); Q_INVOKABLE void copyToClipboard(const QString& text);
QString getDialogConnectErrorText() const; QString getDialogConnectErrorText() const;

View file

@ -55,8 +55,11 @@ void VpnConnection::onConnectionStateChanged(VpnProtocol::VpnConnectionState sta
IpcClient::Interface()->routeDeleteList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0"); IpcClient::Interface()->routeDeleteList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0");
//qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size(); //qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size();
} }
QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString();
QString dns2 = m_vpnConfiguration.value(config_key::dns1).toString();
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(),
QStringList() << m_settings.primaryDns() << m_settings.secondaryDns()); QStringList() << dns1 << dns2);
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) { if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
@ -194,12 +197,12 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex,
ErrorCode *errorCode) ErrorCode *errorCode)
{ {
ErrorCode e = ErrorCode::NoError; ErrorCode e = ErrorCode::NoError;
auto lastVpnConfig = getLastVpnConfig(containerConfig); QMap<Proto, QString> lastVpnConfig = getLastVpnConfig(containerConfig);
QString configData; QString configData;
if (lastVpnConfig.contains(proto)) { if (lastVpnConfig.contains(proto)) {
configData = lastVpnConfig.value(proto); configData = lastVpnConfig.value(proto);
configData = VpnConfigurator::processConfigWithLocalSettings(container, proto, configData); configData = VpnConfigurator::processConfigWithLocalSettings(serverIndex, container, proto, configData);
qDebug() << "VpnConnection::createVpnConfiguration: using saved config for" << ProtocolProps::protoToString(proto); qDebug() << "VpnConnection::createVpnConfiguration: using saved config for" << ProtocolProps::protoToString(proto);
} }
@ -210,7 +213,7 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex,
QString configDataBeforeLocalProcessing = configData; QString configDataBeforeLocalProcessing = configData;
configData = VpnConfigurator::processConfigWithLocalSettings(container, proto, configData); configData = VpnConfigurator::processConfigWithLocalSettings(serverIndex, container, proto, configData);
if (errorCode && e) { if (errorCode && e) {
@ -256,6 +259,11 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex,
Proto proto = ContainerProps::defaultProtocol(container); Proto proto = ContainerProps::defaultProtocol(container);
vpnConfiguration[config_key::vpnproto] = ProtocolProps::protoToString(proto); vpnConfiguration[config_key::vpnproto] = ProtocolProps::protoToString(proto);
auto dns = VpnConfigurator::getDnsForConfig(serverIndex);
vpnConfiguration[config_key::dns1] = dns.first;
vpnConfiguration[config_key::dns2] = dns.second;
return vpnConfiguration; return vpnConfiguration;
} }
@ -285,11 +293,8 @@ void VpnConnection::connectToVpn(int serverIndex,
if (m_vpnProtocol) { if (m_vpnProtocol) {
disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError);
//qDebug() << "VpnConnection::connectToVpn 1";
m_vpnProtocol->stop(); m_vpnProtocol->stop();
//qDebug() << "VpnConnection::connectToVpn 2";
m_vpnProtocol.reset(); m_vpnProtocol.reset();
//qDebug() << "VpnConnection::connectToVpn 3";
} }
ErrorCode e = ErrorCode::NoError; ErrorCode e = ErrorCode::NoError;