custom sitet pre release

This commit is contained in:
pokamest 2021-06-01 18:18:09 +03:00
parent 34b97bdc24
commit 9dbe15a0e3
156 changed files with 5404 additions and 326 deletions

View file

@ -4,6 +4,7 @@
#define APPLICATION_NAME "AmneziaVPN"
#define SERVICE_NAME "AmneziaVPN-service"
#define ORGANIZATION_NAME "AmneziaVPN.ORG"
#define APP_VERSION "1.6.1.0"
#define APP_MAJOR_VERSION "1.7.3"
#define APP_VERSION "1.7.3.0"
#endif // DEFINES_H

View file

@ -3,11 +3,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDI_ICON1 ICON "../images/app.ico"
#define VER_FILEVERSION 1,6,1,0
#define VER_FILEVERSION_STR "1.6.1.0\0"
#define VER_FILEVERSION 1,7,0,0
#define VER_FILEVERSION_STR "1.7.0.0\0"
#define VER_PRODUCTVERSION 1,6,1,0
#define VER_PRODUCTVERSION_STR "1.6.1.0\0"
#define VER_PRODUCTVERSION 1,7,0,0
#define VER_PRODUCTVERSION_STR "1.7.0.0\0"
#define VER_COMPANYNAME_STR "AmneziaVPN"
#define VER_FILEDESCRIPTION_STR "AmneziaVPN"

View file

@ -59,7 +59,7 @@ ErrorCode OpenVpnOverCloakProtocol::start()
m_errorHandlerConnection = connect(&m_ckProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){
qDebug().noquote() << "OpenVpnOverCloakProtocol finished, exitCode, exiStatus" << exitCode << exitStatus;
setConnectionState(VpnProtocol::ConnectionState::Disconnected);
setConnectionState(VpnProtocol::Disconnected);
if (exitStatus != QProcess::NormalExit){
emit protocolError(amnezia::ErrorCode::CloakExecutableCrashed);
stop();

View file

@ -28,16 +28,16 @@ void OpenVpnProtocol::stop()
// TODO: need refactoring
// sendTermSignal() will even return true while server connected ???
if ((m_connectionState == VpnProtocol::ConnectionState::Preparing) ||
(m_connectionState == VpnProtocol::ConnectionState::Connecting) ||
(m_connectionState == VpnProtocol::ConnectionState::Connected) ||
(m_connectionState == VpnProtocol::ConnectionState::Reconnecting)) {
if ((m_connectionState == VpnProtocol::Preparing) ||
(m_connectionState == VpnProtocol::Connecting) ||
(m_connectionState == VpnProtocol::Connected) ||
(m_connectionState == VpnProtocol::Reconnecting)) {
if (!sendTermSignal()) {
killOpenVpnProcess();
}
m_managementServer.stop();
qApp->processEvents();
setConnectionState(VpnProtocol::ConnectionState::Disconnecting);
setConnectionState(VpnProtocol::Disconnecting);
}
}
@ -125,9 +125,9 @@ void OpenVpnProtocol::updateRouteGateway(QString line)
QString OpenVpnProtocol::openVpnExecPath() const
{
#ifdef Q_OS_WIN
return Utils::executable(QString("openvpn/%1/openvpn").arg(QSysInfo::buildCpuArchitecture()), true);
return Utils::executable("openvpn/openvpn", true);
#else
return Utils::executable(QString("/openvpn"), true);
return Utils::executable("/openvpn", true);
#endif
}
@ -233,14 +233,14 @@ void OpenVpnProtocol::onReadyReadDataFromManagementServer()
if (line.contains("CONNECTED,SUCCESS")) {
sendByteCount();
stopTimeoutTimer();
setConnectionState(VpnProtocol::ConnectionState::Connected);
setConnectionState(VpnProtocol::Connected);
continue;
} else if (line.contains("EXITING,SIGTER")) {
//openVpnStateSigTermHandler();
setConnectionState(VpnProtocol::ConnectionState::Disconnecting);
setConnectionState(VpnProtocol::Disconnecting);
continue;
} else if (line.contains("RECONNECTING")) {
setConnectionState(VpnProtocol::ConnectionState::Reconnecting);
setConnectionState(VpnProtocol::Reconnecting);
continue;
}
}

View file

@ -53,7 +53,7 @@ ErrorCode ShadowSocksVpnProtocol::start()
connect(&m_ssProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){
qDebug().noquote() << "ShadowSocksVpnProtocol finished, exitCode, exiStatus" << exitCode << exitStatus;
setConnectionState(VpnProtocol::ConnectionState::Disconnected);
setConnectionState(VpnProtocol::Disconnected);
if (exitStatus != QProcess::NormalExit){
emit protocolError(amnezia::ErrorCode::ShadowSocksExecutableCrashed);
stop();

View file

@ -120,7 +120,7 @@ MainWindow::MainWindow(QWidget *parent) :
connect(m_vpnConnection, SIGNAL(connectionStateChanged(VpnProtocol::ConnectionState)), this, SLOT(onConnectionStateChanged(VpnProtocol::ConnectionState)));
connect(m_vpnConnection, SIGNAL(vpnProtocolError(amnezia::ErrorCode)), this, SLOT(onVpnProtocolError(amnezia::ErrorCode)));
onConnectionStateChanged(VpnProtocol::ConnectionState::Disconnected);
onConnectionStateChanged(VpnProtocol::Disconnected);
if (m_settings.isAutoConnect() && m_settings.defaultServerIndex() >= 0) {
QTimer::singleShot(1000, this, [this](){
@ -350,6 +350,9 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
case Qt::Key_Q:
qApp->quit();
break;
// case Qt::Key_0:
// *((char*)-1) = 'x';
// break;
case Qt::Key_H:
selectedServerIndex = m_settings.defaultServerIndex();
selectedDockerContainer = m_settings.defaultContainer(selectedServerIndex);
@ -891,38 +894,38 @@ void MainWindow::onConnectionStateChanged(VpnProtocol::ConnectionState state)
setTrayState(state);
switch (state) {
case VpnProtocol::ConnectionState::Disconnected:
case VpnProtocol::Disconnected:
onBytesChanged(0,0);
ui->pushButton_connect->setChecked(false);
pushButtonConnectEnabled = true;
radioButtonsModeEnabled = true;
break;
case VpnProtocol::ConnectionState::Preparing:
case VpnProtocol::Preparing:
pushButtonConnectEnabled = false;
radioButtonsModeEnabled = false;
break;
case VpnProtocol::ConnectionState::Connecting:
case VpnProtocol::Connecting:
pushButtonConnectEnabled = false;
radioButtonsModeEnabled = false;
break;
case VpnProtocol::ConnectionState::Connected:
case VpnProtocol::Connected:
pushButtonConnectEnabled = true;
radioButtonsModeEnabled = false;
break;
case VpnProtocol::ConnectionState::Disconnecting:
case VpnProtocol::Disconnecting:
pushButtonConnectEnabled = false;
radioButtonsModeEnabled = false;
break;
case VpnProtocol::ConnectionState::Reconnecting:
case VpnProtocol::Reconnecting:
pushButtonConnectEnabled = true;
radioButtonsModeEnabled = false;
break;
case VpnProtocol::ConnectionState::Error:
case VpnProtocol::Error:
ui->pushButton_connect->setChecked(false);
pushButtonConnectEnabled = true;
radioButtonsModeEnabled = true;
break;
case VpnProtocol::ConnectionState::Unknown:
case VpnProtocol::Unknown:
pushButtonConnectEnabled = true;
radioButtonsModeEnabled = true;
}
@ -976,7 +979,7 @@ void MainWindow::setupTray()
});
m_tray.setContextMenu(m_menu);
setTrayState(VpnProtocol::ConnectionState::Disconnected);
setTrayState(VpnProtocol::Disconnected);
m_tray.show();
@ -1129,27 +1132,31 @@ void MainWindow::setupSitesPageConnections()
QItemSelectionModel* selection = ui->tableView_sites->selectionModel();
if (!selection) return;
QModelIndexList indexes = selection->selectedRows();
{
QModelIndexList indexesSites = selection->selectedRows(0);
QStringList sites;
for (const QModelIndex &index : indexes) {
sites.append(index.data().toString());
QStringList sites;
for (const QModelIndex &index : indexesSites) {
sites.append(index.data().toString());
}
m_settings.removeVpnSites(mode, sites);
}
if (m_vpnConnection->connectionState() == VpnProtocol::Connected) {
QModelIndexList indexesIps = selection->selectedRows(1);
QStringList ips;
for (const QModelIndex &index : indexesIps) {
ips.append(index.data().toString());
}
m_vpnConnection->deleteRoutes(ips);
m_vpnConnection->flushDns();
}
m_settings.removeVpnSites(mode, sites);
updateSitesPage();
// if (m_vpnConnection->connectionState() == VpnProtocol::ConnectionState::Connected) {
// if (IpcClient::Interface()) IpcClient::Interface()->routeDelete(ipToDelete, "");
// if (IpcClient::Interface()) IpcClient::Interface()->flushDns();
// }
// if (m_vpnConnection->connectionState() == VpnProtocol::ConnectionState::Connected) {
// if (IpcClient::Interface())
// IpcClient::Interface()->routeDelete(m_vpnConnection->vpnProtocol()->vpnGateway(),
// QStringList() << ip);
// }
});
connect(ui->pushButton_sites_import, &QPushButton::clicked, this, [this](){
@ -1174,6 +1181,10 @@ void MainWindow::setupSitesPageConnections()
}
m_settings.addVpnIps(mode, ips);
m_vpnConnection->addRoutes(QStringList() << ips);
m_vpnConnection->flushDns();
updateSitesPage();
});
}
@ -1678,32 +1689,32 @@ void MainWindow::setTrayState(VpnProtocol::ConnectionState state)
{
QString resourcesPath = ":/images/tray/%1";
m_trayActionDisconnect->setEnabled(state == VpnProtocol::ConnectionState::Connected);
m_trayActionConnect->setEnabled(state == VpnProtocol::ConnectionState::Disconnected);
m_trayActionDisconnect->setEnabled(state == VpnProtocol::Connected);
m_trayActionConnect->setEnabled(state == VpnProtocol::Disconnected);
switch (state) {
case VpnProtocol::ConnectionState::Disconnected:
case VpnProtocol::Disconnected:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Preparing:
case VpnProtocol::Preparing:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Connecting:
case VpnProtocol::Connecting:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Connected:
case VpnProtocol::Connected:
setTrayIcon(QString(resourcesPath).arg(ConnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Disconnecting:
case VpnProtocol::Disconnecting:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Reconnecting:
case VpnProtocol::Reconnecting:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
break;
case VpnProtocol::ConnectionState::Error:
case VpnProtocol::Error:
setTrayIcon(QString(resourcesPath).arg(ErrorTrayIconName));
break;
case VpnProtocol::ConnectionState::Unknown:
case VpnProtocol::Unknown:
default:
setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName));
}
@ -1759,7 +1770,10 @@ void MainWindow::onConnectWorker(int serverIndex, const ServerCredentials &crede
ui->pushButton_connect->setChecked(true);
qApp->processEvents();
ErrorCode errorCode = m_vpnConnection->connectToVpn(serverIndex, credentials, container, containerConfig);
ErrorCode errorCode = m_vpnConnection->connectToVpn(
serverIndex, credentials, container, containerConfig
);
if (errorCode) {
//ui->pushButton_connect->setChecked(false);
QMessageBox::critical(this, APPLICATION_NAME, errorString(errorCode));
@ -1810,11 +1824,8 @@ void MainWindow::onPushButtonAddCustomSitesClicked()
const auto &cbProcess = [this, mode](const QString &newSite, const QString &ip) {
m_settings.addVpnSite(mode, newSite, ip);
if (m_vpnConnection->connectionState() == VpnProtocol::ConnectionState::Connected) {
if (IpcClient::Interface())
IpcClient::Interface()->routeAddList(m_vpnConnection->vpnProtocol()->vpnGateway(),
QStringList() << ip);
}
m_vpnConnection->addRoutes(QStringList() << ip);
m_vpnConnection->flushDns();
updateSitesPage();
};
@ -1886,6 +1897,12 @@ void MainWindow::updateAppSettingsPage()
ui->lineEdit_network_settings_dns1->setText(m_settings.primaryDns());
ui->lineEdit_network_settings_dns2->setText(m_settings.secondaryDns());
QString ver = QString("%1: %2 (%3)")
.arg(tr("Software version"))
.arg(QString(APP_MAJOR_VERSION))
.arg(__DATE__);
ui->label_app_settings_version->setText(ver);
}
void MainWindow::updateGeneralSettingPage()
@ -2049,7 +2066,7 @@ void MainWindow::updateSharingPage(int serverIndex, const ServerCredentials &cre
selectedDockerContainer = container;
selectedServerIndex = serverIndex;
const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container);
//const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container);
for (QWidget *page : {
ui->page_share_amnezia,

View file

@ -274,7 +274,7 @@ QPushButton:hover {
<string notr="true"/>
</property>
<property name="currentIndex">
<number>10</number>
<number>13</number>
</property>
<widget class="QWidget" name="page_start">
<widget class="QLabel" name="label_25">
@ -4035,7 +4035,7 @@ background: #211966;
<string>Check for updates</string>
</property>
</widget>
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="label_app_settings_version">
<property name="geometry">
<rect>
<x>30</x>
@ -4045,7 +4045,7 @@ background: #211966;
</rect>
</property>
<property name="text">
<string>Software version: 1.7.0 (18.05.2021)</string>
<string>Software version: X.X.X (01.06.2021)</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_app_settings_start_minimized">
@ -5549,8 +5549,8 @@ QToolBox::tab:hover {
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>360</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="styleSheet">
@ -5677,8 +5677,8 @@ background: #282932;
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>360</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<attribute name="label">
@ -5873,8 +5873,8 @@ background: #282932;
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>360</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<attribute name="label">
@ -6039,8 +6039,8 @@ background: #282932;
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>360</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="styleSheet">
@ -6263,8 +6263,8 @@ color: #15CDCB;
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>360</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<attribute name="label">

View file

@ -195,9 +195,27 @@ QString Utils::netMaskFromIpWithSubnet(const QString ip)
QString Utils::ipAddressFromIpWithSubnet(const QString ip)
{
if (ip.count(".") != 3) return "";
return ip.split("/").first();
}
QStringList Utils::summarizeRoutes(const QStringList &ips, const QString cidr)
{
// QMap<int, int>
// QHostAddress
// QMap<QString, QStringList> subnets; // <"a.b", <list subnets>>
// for (const QString &ip : ips) {
// if (ip.count(".") != 3) continue;
// const QStringList &parts = ip.split(".");
// subnets[parts.at(0) + "." + parts.at(1)].append(ip);
// }
return QStringList();
}
#ifdef Q_OS_WIN
// Inspired from http://stackoverflow.com/a/15281070/1529139
// and http://stackoverflow.com/q/40059902/1529139

View file

@ -42,6 +42,8 @@ public:
static QString netMaskFromIpWithSubnet(const QString ip);
static QString ipAddressFromIpWithSubnet(const QString ip);
static QStringList summarizeRoutes(const QStringList &ips, const QString cidr);
#ifdef Q_OS_WIN
static bool signalCtrl(DWORD dwProcessId, DWORD dwCtrlEvent);
#endif

View file

@ -40,22 +40,26 @@ void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes)
void VpnConnection::onConnectionStateChanged(VpnProtocol::ConnectionState state)
{
if (IpcClient::Interface()) {
if (state == VpnProtocol::ConnectionState::Connected && IpcClient::Interface()){
if (state == VpnProtocol::Connected){
IpcClient::Interface()->flushDns();
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
IpcClient::Interface()->routeDelete("0.0.0.0", m_vpnProtocol->vpnGateway());
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(),
QStringList() << m_settings.primaryDns() << m_settings.secondaryDns());
const QStringList &forwardIps = m_settings.getVpnIps(Settings::VpnOnlyForwardSites);
qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size();
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), forwardIps);
IpcClient::Interface()->routeDeleteList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0");
//qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size();
}
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(),
QStringList() << m_settings.primaryDns() << m_settings.secondaryDns());
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), m_settings.getVpnIps(Settings::VpnOnlyForwardSites));
}
else if (m_settings.routeMode() == Settings::VpnAllExceptSites) {
IpcClient::Interface()->routeAddList(m_vpnProtocol->routeGateway(), m_settings.getVpnIps(Settings::VpnAllExceptSites));
}
}
else if (state == VpnProtocol::ConnectionState::Error) {
else if (state == VpnProtocol::Error) {
IpcClient::Interface()->flushDns();
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
@ -72,6 +76,35 @@ QSharedPointer<VpnProtocol> VpnConnection::vpnProtocol() const
return m_vpnProtocol;
}
void VpnConnection::addRoutes(const QStringList &ips)
{
if (connectionState() == VpnProtocol::Connected && IpcClient::Interface()) {
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), ips);
}
else if (m_settings.routeMode() == Settings::VpnAllExceptSites) {
IpcClient::Interface()->routeAddList(m_vpnProtocol->routeGateway(), ips);
}
}
}
void VpnConnection::deleteRoutes(const QStringList &ips)
{
if (connectionState() == VpnProtocol::Connected && IpcClient::Interface()) {
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
IpcClient::Interface()->routeDeleteList(vpnProtocol()->vpnGateway(), ips);
}
else if (m_settings.routeMode() == Settings::VpnAllExceptSites) {
IpcClient::Interface()->routeDeleteList(m_vpnProtocol->routeGateway(), ips);
}
}
}
void VpnConnection::flushDns()
{
if (IpcClient::Interface()) IpcClient::Interface()->flushDns();
}
ErrorCode VpnConnection::lastError() const
{
if (!m_vpnProtocol.data()) {
@ -197,11 +230,12 @@ ErrorCode VpnConnection::createVpnConfiguration(int serverIndex,
return ErrorCode::NoError;
}
ErrorCode VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig)
ErrorCode VpnConnection::connectToVpn(int serverIndex,
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig)
{
qDebug() << "СonnectToVpn, Route mode is" << m_settings.routeMode();
emit connectionStateChanged(VpnProtocol::ConnectionState::Connecting);
emit connectionStateChanged(VpnProtocol::Connecting);
ServerController::setupServerFirewall(credentials);
@ -214,42 +248,42 @@ ErrorCode VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &
if (container == DockerContainer::None || container == DockerContainer::OpenVpn) {
ErrorCode e = createVpnConfiguration(serverIndex, credentials, DockerContainer::OpenVpn, containerConfig);
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
m_vpnProtocol.reset(new OpenVpnProtocol(m_vpnConfiguration));
e = static_cast<OpenVpnProtocol *>(m_vpnProtocol.data())->checkAndSetupTapDriver();
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
}
else if (container == DockerContainer::OpenVpnOverShadowSocks) {
ErrorCode e = createVpnConfiguration(serverIndex, credentials, DockerContainer::OpenVpnOverShadowSocks, containerConfig);
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
m_vpnProtocol.reset(new ShadowSocksVpnProtocol(m_vpnConfiguration));
e = static_cast<OpenVpnProtocol *>(m_vpnProtocol.data())->checkAndSetupTapDriver();
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
}
else if (container == DockerContainer::OpenVpnOverCloak) {
ErrorCode e = createVpnConfiguration(serverIndex, credentials, DockerContainer::OpenVpnOverCloak, containerConfig);
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
m_vpnProtocol.reset(new OpenVpnOverCloakProtocol(m_vpnConfiguration));
e = static_cast<OpenVpnProtocol *>(m_vpnProtocol.data())->checkAndSetupTapDriver();
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
emit connectionStateChanged(VpnProtocol::Error);
return e;
}
}
@ -276,9 +310,8 @@ void VpnConnection::disconnectFromVpn()
if (IpcClient::Interface()) {
IpcClient::Interface()->flushDns();
if (m_settings.routeMode() == Settings::VpnOnlyForwardSites) {
IpcClient::Interface()->clearSavedRoutes();
}
// delete cached routes
IpcClient::Interface()->clearSavedRoutes();
}
if (!m_vpnProtocol.data()) {
@ -289,7 +322,7 @@ void VpnConnection::disconnectFromVpn()
VpnProtocol::ConnectionState VpnConnection::connectionState()
{
if (!m_vpnProtocol) return VpnProtocol::ConnectionState::Disconnected;
if (!m_vpnProtocol) return VpnProtocol::Disconnected;
return m_vpnProtocol->connectionState();
}

View file

@ -33,16 +33,21 @@ public:
ErrorCode createVpnConfiguration(int serverIndex,
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
ErrorCode connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
ErrorCode connectToVpn(int serverIndex,
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
void disconnectFromVpn();
bool isConnected() const;
bool isDisconnected() const;
VpnProtocol::ConnectionState connectionState();
QSharedPointer<VpnProtocol> vpnProtocol() const;
void addRoutes(const QStringList &ips);
void deleteRoutes(const QStringList &ips);
void flushDns();
signals:
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
void connectionStateChanged(VpnProtocol::ConnectionState state);
@ -60,6 +65,7 @@ protected:
private:
Settings m_settings;
QJsonObject m_vpnConfiguration;
QJsonObject m_routeMode;
};