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

159 lines
4.5 KiB
C++
Raw Normal View History

2021-09-06 12:39:46 +03:00
#include <QDebug>
2021-09-03 20:17:13 +03:00
#include <QDesktopServices>
2021-09-03 22:15:05 +03:00
#include <QFile>
2021-09-03 20:17:13 +03:00
#include <QHostInfo>
#include "SitesLogic.h"
2021-09-07 21:01:56 +03:00
#include "VpnLogic.h"
2021-09-03 20:17:13 +03:00
#include "utils.h"
#include "vpnconnection.h"
#include <functional>
#include "../uilogic.h"
2021-09-09 20:15:44 +03:00
#include "../models/sites_model.h"
2021-09-03 20:17:13 +03:00
2021-09-07 21:01:56 +03:00
SitesLogic::SitesLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent),
2021-09-03 20:17:13 +03:00
m_labelSitesAddCustomText{},
m_tableViewSitesModel{nullptr},
m_lineEditSitesAddCustomText{}
{
sitesModels.insert(Settings::VpnOnlyForwardSites, new SitesModel(Settings::VpnOnlyForwardSites));
sitesModels.insert(Settings::VpnAllExceptSites, new SitesModel(Settings::VpnAllExceptSites));
}
2021-11-06 13:47:52 +03:00
void SitesLogic::onUpdatePage()
2021-09-03 20:17:13 +03:00
{
Settings::RouteMode m = m_settings.routeMode();
if (m == Settings::VpnAllSites) return;
if (m == Settings::VpnOnlyForwardSites) {
2021-09-08 13:52:36 +03:00
set_labelSitesAddCustomText(tr("These sites will be opened using VPN"));
2021-09-03 20:17:13 +03:00
}
if (m == Settings::VpnAllExceptSites) {
2021-09-08 13:52:36 +03:00
set_labelSitesAddCustomText(tr("These sites will be excepted from VPN"));
2021-09-03 20:17:13 +03:00
}
2021-09-08 13:52:36 +03:00
set_tableViewSitesModel(sitesModels.value(m));
2021-09-03 20:17:13 +03:00
sitesModels.value(m)->resetCache();
}
void SitesLogic::onPushButtonAddCustomSitesClicked()
{
2021-09-08 13:52:36 +03:00
if (uiLogic()->vpnLogic()->radioButtonVpnModeAllSitesChecked()) {
2021-09-03 20:17:13 +03:00
return;
}
Settings::RouteMode mode = m_settings.routeMode();
2021-09-08 13:52:36 +03:00
QString newSite = lineEditSitesAddCustomText();
2021-09-03 20:17:13 +03:00
if (newSite.isEmpty()) return;
if (!newSite.contains(".")) return;
if (!Utils::ipAddressWithSubnetRegExp().exactMatch(newSite)) {
// get domain name if it present
newSite.replace("https://", "");
newSite.replace("http://", "");
newSite.replace("ftp://", "");
newSite = newSite.split("/", QString::SkipEmptyParts).first();
}
const auto &cbProcess = [this, mode](const QString &newSite, const QString &ip) {
m_settings.addVpnSite(mode, newSite, ip);
if (!ip.isEmpty()) {
2021-09-07 21:01:56 +03:00
uiLogic()->m_vpnConnection->addRoutes(QStringList() << ip);
uiLogic()->m_vpnConnection->flushDns();
2021-09-03 20:17:13 +03:00
}
else if (Utils::ipAddressWithSubnetRegExp().exactMatch(newSite)) {
2021-09-07 21:01:56 +03:00
uiLogic()->m_vpnConnection->addRoutes(QStringList() << newSite);
uiLogic()->m_vpnConnection->flushDns();
2021-09-03 20:17:13 +03:00
}
2021-11-06 13:47:52 +03:00
onUpdatePage();
2021-09-03 20:17:13 +03:00
};
const auto &cbResolv = [this, cbProcess](const QHostInfo &hostInfo){
const QList<QHostAddress> &addresses = hostInfo.addresses();
QString ipv4Addr;
for (const QHostAddress &addr: hostInfo.addresses()) {
if (addr.protocol() == QAbstractSocket::NetworkLayerProtocol::IPv4Protocol) {
cbProcess(hostInfo.hostName(), addr.toString());
break;
}
}
};
2021-09-08 13:52:36 +03:00
set_lineEditSitesAddCustomText("");
2021-09-03 20:17:13 +03:00
if (Utils::ipAddressWithSubnetRegExp().exactMatch(newSite)) {
cbProcess(newSite, "");
return;
}
else {
cbProcess(newSite, "");
2021-11-06 13:47:52 +03:00
onUpdatePage();
2021-09-03 20:17:13 +03:00
QHostInfo::lookupHost(newSite, this, cbResolv);
}
}
void SitesLogic::onPushButtonSitesDeleteClicked(int row)
{
Settings::RouteMode mode = m_settings.routeMode();
2021-09-08 13:52:36 +03:00
auto siteModel = qobject_cast<SitesModel*> (tableViewSitesModel());
2021-09-03 20:17:13 +03:00
if (!siteModel) {
return;
}
if (row < 0 || row >= siteModel->rowCount()) {
return;
}
{
QStringList sites;
sites.append(siteModel->data(row, 0).toString());
m_settings.removeVpnSites(mode, sites);
}
2021-09-07 21:01:56 +03:00
if (uiLogic()->m_vpnConnection->connectionState() == VpnProtocol::Connected) {
2021-09-03 20:17:13 +03:00
QStringList ips;
ips.append(siteModel->data(row, 1).toString());
2021-09-07 21:01:56 +03:00
uiLogic()->m_vpnConnection->deleteRoutes(ips);
uiLogic()->m_vpnConnection->flushDns();
2021-09-03 20:17:13 +03:00
}
2021-11-06 13:47:52 +03:00
onUpdatePage();
2021-09-03 20:17:13 +03:00
}
void SitesLogic::onPushButtonSitesImportClicked(const QString& fileName)
{
QFile file(QUrl{fileName}.toLocalFile());
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Can't open file " << QUrl{fileName}.toLocalFile();
return;
}
Settings::RouteMode mode = m_settings.routeMode();
QStringList ips;
while (!file.atEnd()) {
QString line = file.readLine();
int pos = 0;
QRegExp rx = Utils::ipAddressWithSubnetRegExp();
while ((pos = rx.indexIn(line, pos)) != -1) {
ips << rx.cap(0);
pos += rx.matchedLength();
}
}
m_settings.addVpnIps(mode, ips);
2021-09-07 21:01:56 +03:00
uiLogic()->m_vpnConnection->addRoutes(QStringList() << ips);
uiLogic()->m_vpnConnection->flushDns();
2021-09-03 20:17:13 +03:00
2021-11-06 13:47:52 +03:00
onUpdatePage();
2021-09-03 20:17:13 +03:00
}