custom sitet pre release
This commit is contained in:
parent
34b97bdc24
commit
9dbe15a0e3
156 changed files with 5404 additions and 326 deletions
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue