Files
amnezia-client/client/ui/pages_logic/VpnLogic.cpp
T

222 lines
7.0 KiB
C++
Raw Normal View History

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"
#include <functional>
2021-09-07 21:01:56 +03:00
#include "../uilogic.h"
2021-12-14 12:50:57 +03:00
#include "defines.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{},
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);
2021-09-07 21:01:56 +03:00
if (m_settings.isAutoConnect() && m_settings.defaultServerIndex() >= 0) {
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();
});
}
}
2021-11-06 13:47:52 +03:00
void VpnLogic::onUpdatePage()
2021-09-07 21:01:56 +03:00
{
Settings::RouteMode mode = m_settings.routeMode();
2021-09-08 13:52:36 +03:00
set_radioButtonVpnModeAllSitesChecked(mode == Settings::VpnAllSites);
set_radioButtonVpnModeForwardSitesChecked(mode == Settings::VpnOnlyForwardSites);
set_radioButtonVpnModeExceptSitesChecked(mode == Settings::VpnAllExceptSites);
2021-11-17 15:01:48 +03:00
const QJsonObject &server = uiLogic()->m_settings.defaultServer();
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
DockerContainer selectedContainer = m_settings.defaultContainer(m_settings.defaultServerIndex());
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
set_isContainerWorkingOnPlatform(ContainerProps::isWorkingOnPlatform(selectedContainer));
if (!isContainerWorkingOnPlatform()) {
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);
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
{
2021-11-19 13:57:00 +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
{
2021-11-19 13:57:00 +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
{
2021-11-19 13:57:00 +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
}
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-09-07 21:01:56 +03:00
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()
{
int serverIndex = m_settings.defaultServerIndex();
ServerCredentials credentials = m_settings.serverCredentials(serverIndex);
DockerContainer container = m_settings.defaultContainer(serverIndex);
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) {
2021-09-08 13:52:36 +03:00
set_labelErrorText(tr("VPN Protocol not choosen"));
set_pushButtonConnectChecked(false);
2021-09-07 21:01:56 +03:00
return;
}
const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container);
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
2021-10-26 12:59:20 +03:00
// if (errorCode) {
// //ui->pushButton_connect->setChecked(false);
// uiLogic()->setDialogConnectErrorText(errorString(errorCode));
// emit uiLogic()->showConnectErrorDialog();
// return;
// }
2021-09-07 21:01:56 +03:00
}
void VpnLogic::onDisconnect()
{
2021-09-08 13:52:36 +03:00
set_pushButtonConnectChecked(false);
2021-10-26 12:59:20 +03:00
emit disconnectFromVpn();
2021-09-03 20:17:13 +03:00
}