2022-02-22 02:08:57 +03:00
|
|
|
#include <QApplication>
|
|
|
|
|
|
2021-09-03 20:17:13 +03:00
|
|
|
#include "VpnLogic.h"
|
2021-09-07 21:01:56 +03:00
|
|
|
|
|
|
|
|
#include "core/errorstrings.h"
|
2021-09-03 20:17:13 +03:00
|
|
|
#include "vpnconnection.h"
|
2022-02-22 02:08:57 +03:00
|
|
|
#include <QTimer>
|
2021-09-03 20:17:13 +03:00
|
|
|
#include <functional>
|
2021-09-07 21:01:56 +03:00
|
|
|
#include "../uilogic.h"
|
2021-12-14 12:50:57 +03:00
|
|
|
#include "defines.h"
|
2022-02-05 15:52:14 +03:00
|
|
|
#include <configurators/vpn_configurator.h>
|
2021-09-07 21:01:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
VpnLogic::VpnLogic(UiLogic *logic, QObject *parent):
|
|
|
|
|
PageLogicBase(logic, parent),
|
|
|
|
|
m_pushButtonConnectChecked{false},
|
|
|
|
|
|
|
|
|
|
m_radioButtonVpnModeAllSitesChecked{true},
|
|
|
|
|
m_radioButtonVpnModeForwardSitesChecked{false},
|
|
|
|
|
m_radioButtonVpnModeExceptSitesChecked{false},
|
|
|
|
|
|
|
|
|
|
m_labelSpeedReceivedText{tr("0 Mbps")},
|
|
|
|
|
m_labelSpeedSentText{tr("0 Mbps")},
|
|
|
|
|
m_labelStateText{},
|
2022-02-15 17:08:55 +03:00
|
|
|
m_isContainerHaveAuthData{false},
|
|
|
|
|
m_isContainerSupportedByCurrentPlatform{false},
|
2021-09-07 21:01:56 +03:00
|
|
|
m_widgetVpnModeEnabled{false}
|
|
|
|
|
{
|
|
|
|
|
connect(uiLogic()->m_vpnConnection, &VpnConnection::bytesChanged, this, &VpnLogic::onBytesChanged);
|
|
|
|
|
connect(uiLogic()->m_vpnConnection, &VpnConnection::connectionStateChanged, this, &VpnLogic::onConnectionStateChanged);
|
|
|
|
|
connect(uiLogic()->m_vpnConnection, &VpnConnection::vpnProtocolError, this, &VpnLogic::onVpnProtocolError);
|
|
|
|
|
|
2021-10-26 12:59:20 +03:00
|
|
|
connect(this, &VpnLogic::connectToVpn, uiLogic()->m_vpnConnection, &VpnConnection::connectToVpn, Qt::QueuedConnection);
|
|
|
|
|
connect(this, &VpnLogic::disconnectFromVpn, uiLogic()->m_vpnConnection, &VpnConnection::disconnectFromVpn, Qt::QueuedConnection);
|
|
|
|
|
|
2023-01-16 17:11:00 +00:00
|
|
|
connect(m_settings.get(), &Settings::saveLogsChanged, this, &VpnLogic::onUpdatePage);
|
2022-12-28 06:50:46 +03:00
|
|
|
|
2022-08-25 12:47:02 +03:00
|
|
|
if (m_settings->isAutoConnect() && m_settings->defaultServerIndex() >= 0) {
|
2021-09-07 21:01:56 +03:00
|
|
|
QTimer::singleShot(1000, this, [this](){
|
2021-09-08 13:52:36 +03:00
|
|
|
set_pushButtonConnectEnabled(false);
|
2021-09-07 21:01:56 +03:00
|
|
|
onConnect();
|
|
|
|
|
});
|
|
|
|
|
}
|
2022-01-23 19:16:40 +03:00
|
|
|
else {
|
|
|
|
|
onConnectionStateChanged(VpnProtocol::Disconnected);
|
|
|
|
|
}
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-11-06 13:47:52 +03:00
|
|
|
void VpnLogic::onUpdatePage()
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2022-08-25 12:47:02 +03:00
|
|
|
Settings::RouteMode mode = m_settings->routeMode();
|
|
|
|
|
DockerContainer selectedContainer = m_settings->defaultContainer(m_settings->defaultServerIndex());
|
2022-01-23 19:16:40 +03:00
|
|
|
|
|
|
|
|
set_isCustomRoutesSupported (selectedContainer == DockerContainer::OpenVpn ||
|
|
|
|
|
selectedContainer == DockerContainer::ShadowSocks||
|
|
|
|
|
selectedContainer == DockerContainer::Cloak);
|
|
|
|
|
|
2022-08-25 12:47:02 +03:00
|
|
|
set_isContainerHaveAuthData(m_settings->haveAuthData(m_settings->defaultServerIndex()));
|
2022-02-15 17:08:55 +03:00
|
|
|
|
2022-01-23 19:16:40 +03:00
|
|
|
set_radioButtonVpnModeAllSitesChecked(mode == Settings::VpnAllSites || !isCustomRoutesSupported());
|
|
|
|
|
set_radioButtonVpnModeForwardSitesChecked(mode == Settings::VpnOnlyForwardSites && isCustomRoutesSupported());
|
|
|
|
|
set_radioButtonVpnModeExceptSitesChecked(mode == Settings::VpnAllExceptSites && isCustomRoutesSupported());
|
2021-11-17 15:01:48 +03:00
|
|
|
|
2022-08-25 12:47:02 +03:00
|
|
|
const QJsonObject &server = uiLogic()->m_settings->defaultServer();
|
2021-11-17 15:01:48 +03:00
|
|
|
QString serverString = QString("%2 (%3)")
|
|
|
|
|
.arg(server.value(config_key::description).toString())
|
|
|
|
|
.arg(server.value(config_key::hostName).toString());
|
|
|
|
|
set_labelCurrentServer(serverString);
|
|
|
|
|
|
2021-11-19 23:04:35 +03:00
|
|
|
QString selectedContainerName = ContainerProps::containerHumanNames().value(selectedContainer);
|
2021-11-17 15:01:48 +03:00
|
|
|
set_labelCurrentService(selectedContainerName);
|
2021-12-11 14:44:24 +03:00
|
|
|
|
2022-08-25 17:35:28 +03:00
|
|
|
auto dns = m_configurator->getDnsForConfig(m_settings->defaultServerIndex());
|
2022-02-05 15:52:14 +03:00
|
|
|
set_amneziaDnsEnabled(dns.first == protocols::dns::amneziaDnsIp);
|
|
|
|
|
if (dns.first == protocols::dns::amneziaDnsIp) {
|
|
|
|
|
set_labelCurrentDns("On your server");
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
set_labelCurrentDns(dns.first + ", " + dns.second);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-02-15 17:08:55 +03:00
|
|
|
set_isContainerSupportedByCurrentPlatform(ContainerProps::isSupportedByCurrentPlatform(selectedContainer));
|
|
|
|
|
if (!isContainerSupportedByCurrentPlatform()) {
|
2021-12-11 14:44:24 +03:00
|
|
|
set_labelErrorText(tr("AmneziaVPN not supporting selected protocol on this device. Select another protocol."));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
set_labelErrorText("");
|
|
|
|
|
}
|
2021-12-14 12:50:57 +03:00
|
|
|
QString ver = QString("v. %2").arg(QString(APP_MAJOR_VERSION));
|
|
|
|
|
set_labelVersionText(ver);
|
2022-12-28 06:50:46 +03:00
|
|
|
|
|
|
|
|
set_labelLogEnabledVisible(m_settings->isSaveLogs());
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-11-19 13:57:00 +03:00
|
|
|
void VpnLogic::onRadioButtonVpnModeAllSitesClicked()
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2022-08-25 12:47:02 +03:00
|
|
|
m_settings->setRouteMode(Settings::VpnAllSites);
|
2021-11-28 19:14:12 +03:00
|
|
|
onUpdatePage();
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
2021-11-19 13:57:00 +03:00
|
|
|
void VpnLogic::onRadioButtonVpnModeForwardSitesClicked()
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2022-08-25 12:47:02 +03:00
|
|
|
m_settings->setRouteMode(Settings::VpnOnlyForwardSites);
|
2021-11-28 19:14:12 +03:00
|
|
|
onUpdatePage();
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
2021-11-19 13:57:00 +03:00
|
|
|
void VpnLogic::onRadioButtonVpnModeExceptSitesClicked()
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2022-08-25 12:47:02 +03:00
|
|
|
m_settings->setRouteMode(Settings::VpnAllExceptSites);
|
2021-11-28 19:14:12 +03:00
|
|
|
onUpdatePage();
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VpnLogic::onBytesChanged(quint64 receivedData, quint64 sentData)
|
|
|
|
|
{
|
2021-09-08 13:52:36 +03:00
|
|
|
set_labelSpeedReceivedText(VpnConnection::bytesPerSecToText(receivedData));
|
|
|
|
|
set_labelSpeedSentText(VpnConnection::bytesPerSecToText(sentData));
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
2021-11-30 16:56:24 +04:00
|
|
|
void VpnLogic::onConnectionStateChanged(VpnProtocol::VpnConnectionState state)
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2021-10-07 22:21:04 +03:00
|
|
|
qDebug() << "VpnLogic::onConnectionStateChanged" << VpnProtocol::textConnectionState(state);
|
2021-12-23 13:13:55 +04:00
|
|
|
if (uiLogic()->m_vpnConnection == NULL) {
|
|
|
|
|
qDebug() << "VpnLogic::onConnectionStateChanged" << VpnProtocol::textConnectionState(state) << "невозможно, соединение отсутствует (уничтожено ранее)";
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-10-07 22:21:04 +03:00
|
|
|
bool pbConnectEnabled = false;
|
2021-11-19 19:02:39 +03:00
|
|
|
bool pbConnectChecked = false;
|
|
|
|
|
|
2021-10-07 22:21:04 +03:00
|
|
|
bool rbModeEnabled = false;
|
2021-11-17 15:01:48 +03:00
|
|
|
bool pbConnectVisible = false;
|
2021-09-08 13:52:36 +03:00
|
|
|
set_labelStateText(VpnProtocol::textConnectionState(state));
|
2021-09-07 21:01:56 +03:00
|
|
|
|
|
|
|
|
switch (state) {
|
|
|
|
|
case VpnProtocol::Disconnected:
|
|
|
|
|
onBytesChanged(0,0);
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = true;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = true;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Preparing:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = false;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = false;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Connecting:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = false;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = false;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Connected:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = true;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = false;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Disconnecting:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = false;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = false;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Reconnecting:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = true;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = false;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Error:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = true;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = true;
|
2021-09-07 21:01:56 +03:00
|
|
|
break;
|
|
|
|
|
case VpnProtocol::Unknown:
|
2021-11-19 19:02:39 +03:00
|
|
|
pbConnectChecked = false;
|
2021-10-07 22:21:04 +03:00
|
|
|
pbConnectEnabled = true;
|
2021-11-17 15:01:48 +03:00
|
|
|
pbConnectVisible = true;
|
2021-10-07 22:21:04 +03:00
|
|
|
rbModeEnabled = true;
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
2021-10-07 22:21:04 +03:00
|
|
|
set_pushButtonConnectEnabled(pbConnectEnabled);
|
2021-11-19 19:02:39 +03:00
|
|
|
set_pushButtonConnectChecked(pbConnectChecked);
|
|
|
|
|
|
2021-11-17 15:01:48 +03:00
|
|
|
set_pushButtonConnectVisible(pbConnectVisible);
|
2021-10-07 22:21:04 +03:00
|
|
|
set_widgetVpnModeEnabled(rbModeEnabled);
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VpnLogic::onVpnProtocolError(ErrorCode errorCode)
|
|
|
|
|
{
|
2021-09-08 13:52:36 +03:00
|
|
|
set_labelErrorText(errorString(errorCode));
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
2021-11-19 19:02:39 +03:00
|
|
|
void VpnLogic::onPushButtonConnectClicked()
|
2021-09-07 21:01:56 +03:00
|
|
|
{
|
2021-11-19 19:02:39 +03:00
|
|
|
if (! pushButtonConnectChecked()) {
|
2021-09-07 21:01:56 +03:00
|
|
|
onConnect();
|
|
|
|
|
} else {
|
|
|
|
|
onDisconnect();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VpnLogic::onConnect()
|
|
|
|
|
{
|
2022-08-25 12:47:02 +03:00
|
|
|
int serverIndex = m_settings->defaultServerIndex();
|
|
|
|
|
ServerCredentials credentials = m_settings->serverCredentials(serverIndex);
|
|
|
|
|
DockerContainer container = m_settings->defaultContainer(serverIndex);
|
2021-09-07 21:01:56 +03:00
|
|
|
|
2022-08-25 12:47:02 +03:00
|
|
|
if (m_settings->containers(serverIndex).isEmpty()) {
|
2021-09-08 13:52:36 +03:00
|
|
|
set_labelErrorText(tr("VPN Protocols is not installed.\n Please install VPN container at first"));
|
|
|
|
|
set_pushButtonConnectChecked(false);
|
2021-09-07 21:01:56 +03:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (container == DockerContainer::None) {
|
2023-04-11 09:50:44 -04:00
|
|
|
set_labelErrorText(tr("VPN Protocol not chosen"));
|
2021-09-08 13:52:36 +03:00
|
|
|
set_pushButtonConnectChecked(false);
|
2021-09-07 21:01:56 +03:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-08-25 12:47:02 +03:00
|
|
|
const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container);
|
2021-09-07 21:01:56 +03:00
|
|
|
onConnectWorker(serverIndex, credentials, container, containerConfig);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VpnLogic::onConnectWorker(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig)
|
|
|
|
|
{
|
2021-09-08 13:52:36 +03:00
|
|
|
set_labelErrorText("");
|
|
|
|
|
set_pushButtonConnectChecked(true);
|
2021-10-07 22:21:04 +03:00
|
|
|
set_pushButtonConnectEnabled(false);
|
|
|
|
|
|
2021-09-07 21:01:56 +03:00
|
|
|
qApp->processEvents();
|
|
|
|
|
|
2021-10-26 12:59:20 +03:00
|
|
|
emit connectToVpn(serverIndex, credentials, container, containerConfig);
|
2021-09-07 21:01:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VpnLogic::onDisconnect()
|
|
|
|
|
{
|
2022-02-22 02:08:57 +03:00
|
|
|
onConnectionStateChanged(VpnProtocol::Disconnected);
|
2021-10-26 12:59:20 +03:00
|
|
|
emit disconnectFromVpn();
|
2021-09-03 20:17:13 +03:00
|
|
|
}
|