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

212 lines
6.6 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"
#include "utilities.h"
2021-09-03 20:17:13 +03:00
#include "vpnconnection.h"
#include <functional>
2021-09-09 20:15:44 +03:00
#include "../models/sites_model.h"
2023-08-08 19:10:14 +05:00
#include "../uilogic.h"
2021-09-03 20:17:13 +03:00
2023-08-08 19:10:14 +05:00
SitesLogic::SitesLogic(UiLogic *logic, QObject *parent)
: PageLogicBase(logic, parent),
m_labelSitesAddCustomText {},
m_tableViewSitesModel { nullptr },
m_lineEditSitesAddCustomText {}
2021-09-03 20:17:13 +03:00
{
2023-08-08 19:10:14 +05:00
// sitesModels.insert(Settings::VpnOnlyForwardSites, new SitesModel(m_settings, Settings::VpnOnlyForwardSites));
// sitesModels.insert(Settings::VpnAllExceptSites, new SitesModel(m_settings, Settings::VpnAllExceptSites));
2021-09-03 20:17:13 +03:00
}
2021-11-06 13:47:52 +03:00
void SitesLogic::onUpdatePage()
2021-09-03 20:17:13 +03:00
{
2022-08-25 12:47:02 +03:00
Settings::RouteMode m = m_settings->routeMode();
2023-08-08 19:10:14 +05:00
if (m == Settings::VpnAllSites)
return;
2021-09-03 20:17:13 +03:00
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));
2023-08-08 19:10:14 +05:00
// sitesModels.value(m)->resetCache();
2021-09-03 20:17:13 +03:00
}
void SitesLogic::onPushButtonAddCustomSitesClicked()
{
2022-08-29 01:32:42 +03:00
if (uiLogic()->pageLogic<VpnLogic>()->radioButtonVpnModeAllSitesChecked()) {
2021-09-03 20:17:13 +03:00
return;
}
2022-08-25 12:47:02 +03:00
Settings::RouteMode mode = m_settings->routeMode();
2021-09-03 20:17:13 +03:00
2021-09-08 13:52:36 +03:00
QString newSite = lineEditSitesAddCustomText();
2021-09-03 20:17:13 +03:00
2023-08-08 19:10:14 +05:00
if (newSite.isEmpty())
return;
if (!newSite.contains("."))
return;
2021-09-03 20:17:13 +03:00
if (!Utils::ipAddressWithSubnetRegExp().exactMatch(newSite)) {
// get domain name if it present
newSite.replace("https://", "");
newSite.replace("http://", "");
newSite.replace("ftp://", "");
newSite = newSite.split("/", Qt::SkipEmptyParts).first();
2021-09-03 20:17:13 +03:00
}
const auto &cbProcess = [this, mode](const QString &newSite, const QString &ip) {
2022-08-25 12:47:02 +03:00
m_settings->addVpnSite(mode, newSite, ip);
2021-09-03 20:17:13 +03:00
if (!ip.isEmpty()) {
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "addRoutes", Qt::QueuedConnection,
2023-08-08 16:41:00 -07:00
Q_ARG(QStringList, QStringList() << ip));
2023-08-09 18:17:29 +05:00
} else if (Utils::ipAddressWithSubnetRegExp().exactMatch(newSite)) {
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "addRoutes", Qt::QueuedConnection,
2023-08-08 16:41:00 -07:00
Q_ARG(QStringList, QStringList() << newSite));
2021-09-03 20:17:13 +03:00
}
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "flushDns", Qt::QueuedConnection);
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
};
2023-08-08 19:10:14 +05:00
const auto &cbResolv = [this, cbProcess](const QHostInfo &hostInfo) {
2021-09-03 20:17:13 +03:00
const QList<QHostAddress> &addresses = hostInfo.addresses();
QString ipv4Addr;
2023-08-08 19:10:14 +05:00
for (const QHostAddress &addr : hostInfo.addresses()) {
2021-09-03 20:17:13 +03:00
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;
2023-08-08 19:10:14 +05:00
} else {
2021-09-03 20:17:13 +03:00
cbProcess(newSite, "");
2021-11-06 13:47:52 +03:00
onUpdatePage();
2021-09-03 20:17:13 +03:00
QHostInfo::lookupHost(newSite, this, cbResolv);
}
}
2022-01-22 18:19:38 +03:00
void SitesLogic::onPushButtonSitesDeleteClicked(QStringList items)
2021-09-03 20:17:13 +03:00
{
2022-08-25 12:47:02 +03:00
Settings::RouteMode mode = m_settings->routeMode();
2021-09-03 20:17:13 +03:00
2023-08-08 19:10:14 +05:00
auto siteModel = qobject_cast<SitesModel *>(tableViewSitesModel());
2022-01-22 18:19:38 +03:00
if (!siteModel || items.isEmpty()) {
2021-09-03 20:17:13 +03:00
return;
}
2022-01-22 18:19:38 +03:00
QStringList sites;
QStringList ips;
2023-08-08 19:10:14 +05:00
for (const QString &s : items) {
2022-01-22 18:19:38 +03:00
bool ok;
int row = s.toInt(&ok);
2023-08-08 19:10:14 +05:00
if (!ok || row < 0 || row >= siteModel->rowCount())
return;
// sites.append(siteModel->data(row, 0).toString());
2022-01-22 18:19:38 +03:00
2023-08-09 18:17:29 +05:00
// if (uiLogic()->m_vpnConnection && uiLogic()->m_vpnConnection->connectionState() == VpnProtocol::Connected) {
// ips.append(siteModel->data(row, 1).toString());
// }
2021-09-03 20:17:13 +03:00
}
2022-08-25 12:47:02 +03:00
m_settings->removeVpnSites(mode, sites);
2022-01-22 18:19:38 +03:00
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "deleteRoutes", Qt::QueuedConnection, Q_ARG(QStringList, ips));
2023-08-08 16:41:00 -07:00
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "flushDns", Qt::QueuedConnection);
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
}
2023-08-08 19:10:14 +05:00
void SitesLogic::onPushButtonSitesImportClicked(const QString &fileName)
2021-09-03 20:17:13 +03:00
{
2023-08-08 19:10:14 +05:00
QFile file(QUrl { fileName }.toLocalFile());
2021-09-03 20:17:13 +03:00
if (!file.open(QIODevice::ReadOnly)) {
2023-08-08 19:10:14 +05:00
qDebug() << "Can't open file " << QUrl { fileName }.toLocalFile();
2021-09-03 20:17:13 +03:00
return;
}
2022-08-25 12:47:02 +03:00
Settings::RouteMode mode = m_settings->routeMode();
2021-09-03 20:17:13 +03:00
QStringList ips;
2022-01-23 19:16:40 +03:00
QMap<QString, QString> sites;
2021-09-03 20:17:13 +03:00
while (!file.atEnd()) {
QString line = file.readLine();
2022-01-23 19:16:40 +03:00
QStringList line_ips;
QStringList line_sites;
int posDomain = 0;
QRegExp domainRx = Utils::domainRegExp();
while ((posDomain = domainRx.indexIn(line, posDomain)) != -1) {
line_sites.append(domainRx.cap(0));
posDomain += domainRx.matchedLength();
}
int posIp = 0;
QRegExp ipRx = Utils::ipAddressWithSubnetRegExp();
while ((posIp = ipRx.indexIn(line, posIp)) != -1) {
line_ips.append(ipRx.cap(0));
posIp += ipRx.matchedLength();
}
// domain regex cover ip regex, so remove ips from sites
2023-08-08 19:10:14 +05:00
for (const QString &ip : line_ips) {
2022-01-23 19:16:40 +03:00
line_sites.removeAll(ip);
}
2021-09-03 20:17:13 +03:00
2022-01-23 19:16:40 +03:00
if (line_sites.size() == 1 && line_ips.size() == 1) {
sites.insert(line_sites.at(0), line_ips.at(0));
2023-08-08 19:10:14 +05:00
} else if (line_sites.size() > 0 && line_ips.size() == 0) {
for (const QString &site : line_sites) {
2022-01-23 19:16:40 +03:00
sites.insert(site, "");
}
2023-08-08 19:10:14 +05:00
} else {
for (const QString &site : line_sites) {
2022-01-23 19:16:40 +03:00
sites.insert(site, "");
}
2023-08-08 19:10:14 +05:00
for (const QString &ip : line_ips) {
2022-01-23 19:16:40 +03:00
ips.append(ip);
}
}
2021-09-03 20:17:13 +03:00
}
2022-08-25 12:47:02 +03:00
m_settings->addVpnIps(mode, ips);
m_settings->addVpnSites(mode, sites);
2021-09-03 20:17:13 +03:00
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "addRoutes", Qt::QueuedConnection, Q_ARG(QStringList, ips));
2023-08-08 16:41:00 -07:00
2023-08-09 18:17:29 +05:00
QMetaObject::invokeMethod(uiLogic()->m_vpnConnection, "flushDns", Qt::QueuedConnection);
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
}
2022-01-22 18:19:38 +03:00
void SitesLogic::onPushButtonSitesExportClicked()
{
2022-08-25 12:47:02 +03:00
Settings::RouteMode mode = m_settings->routeMode();
2022-01-22 18:19:38 +03:00
2022-08-25 12:47:02 +03:00
QVariantMap sites = m_settings->vpnSites(mode);
2022-01-22 18:19:38 +03:00
QString data;
for (auto s : sites.keys()) {
data += s + "\t" + sites.value(s).toString() + "\n";
}
uiLogic()->saveTextFile("Export Sites", "sites.txt", ".txt", data);
2022-01-22 18:19:38 +03:00
}