VPN connection moved to separate thread
This commit is contained in:
parent
1b1a5be607
commit
44f4d083bf
10 changed files with 166 additions and 104 deletions
|
|
@ -1,38 +1,83 @@
|
||||||
#include "ipcclient.h"
|
#include "ipcclient.h"
|
||||||
#include <QRemoteObjectNode>
|
#include <QRemoteObjectNode>
|
||||||
|
|
||||||
IpcClient &IpcClient::Instance()
|
IpcClient *IpcClient::m_instance = nullptr;
|
||||||
|
|
||||||
|
IpcClient::IpcClient(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
static IpcClient s;
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IpcClient::init()
|
IpcClient::~IpcClient()
|
||||||
{
|
{
|
||||||
Instance().m_localSocket->waitForConnected();
|
if (m_localSocket) m_localSocket->close();
|
||||||
|
}
|
||||||
|
|
||||||
if (!Instance().m_ipcClient) {
|
bool IpcClient::isSocketConnected() const
|
||||||
|
{
|
||||||
|
return m_isSocketConnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
IpcClient *IpcClient::Instance()
|
||||||
|
{
|
||||||
|
return m_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSharedPointer<IpcInterfaceReplica> IpcClient::Interface()
|
||||||
|
{
|
||||||
|
if (!Instance()) return nullptr;
|
||||||
|
return Instance()->m_ipcClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IpcClient::init(IpcClient *instance)
|
||||||
|
{
|
||||||
|
m_instance = instance;
|
||||||
|
|
||||||
|
Instance()->m_localSocket = new QLocalSocket(Instance());
|
||||||
|
connect(Instance()->m_localSocket.data(), &QLocalSocket::connected, &Instance()->m_ClientNode, []() {
|
||||||
|
Instance()->m_ClientNode.addClientSideConnection(Instance()->m_localSocket.data());
|
||||||
|
|
||||||
|
Instance()->m_ipcClient.reset(Instance()->m_ClientNode.acquire<IpcInterfaceReplica>());
|
||||||
|
Instance()->m_ipcClient->waitForSource(1000);
|
||||||
|
|
||||||
|
if (!Instance()->m_ipcClient->isReplicaValid()) {
|
||||||
|
qWarning() << "IpcClient replica is not connected!";
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(Instance()->m_localSocket, &QLocalSocket::disconnected, [instance](){
|
||||||
|
instance->m_isSocketConnected = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
Instance()->m_localSocket->connectToServer(amnezia::getIpcServiceUrl());
|
||||||
|
|
||||||
|
Instance()->m_localSocket->waitForConnected();
|
||||||
|
|
||||||
|
if (!Instance()->m_ipcClient) {
|
||||||
qDebug() << "IpcClient::init failed";
|
qDebug() << "IpcClient::init failed";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Instance().m_ipcClient->isReplicaValid();
|
qDebug() << "IpcClient::init succeed";
|
||||||
|
|
||||||
|
return Instance()->m_ipcClient->isReplicaValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
QSharedPointer<IpcProcessInterfaceReplica> IpcClient::CreatePrivilegedProcess()
|
QSharedPointer<IpcProcessInterfaceReplica> IpcClient::CreatePrivilegedProcess()
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_IOS
|
#ifndef Q_OS_IOS
|
||||||
if (! Instance().m_ipcClient || ! Instance().m_ipcClient->isReplicaValid()) {
|
if (! Instance()->m_ipcClient || ! Instance()->m_ipcClient->isReplicaValid()) {
|
||||||
qWarning() << "IpcClient::createPrivilegedProcess : IpcClient IpcClient replica is not valid";
|
qWarning() << "IpcClient::createPrivilegedProcess : IpcClient IpcClient replica is not valid";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QRemoteObjectPendingReply<int> futureResult = Instance().m_ipcClient->createPrivilegedProcess();
|
QRemoteObjectPendingReply<int> futureResult = Instance()->m_ipcClient->createPrivilegedProcess();
|
||||||
futureResult.waitForFinished(1000);
|
futureResult.waitForFinished(1000);
|
||||||
|
|
||||||
int pid = futureResult.returnValue();
|
int pid = futureResult.returnValue();
|
||||||
|
|
||||||
auto pd = QSharedPointer<ProcessDescriptor>(new ProcessDescriptor());
|
auto pd = QSharedPointer<ProcessDescriptor>(new ProcessDescriptor());
|
||||||
Instance().m_processNodes.insert(pid, pd);
|
Instance()->m_processNodes.insert(pid, pd);
|
||||||
|
|
||||||
pd->localSocket.reset(new QLocalSocket(pd->replicaNode.data()));
|
pd->localSocket.reset(new QLocalSocket(pd->replicaNode.data()));
|
||||||
|
|
||||||
|
|
@ -65,19 +110,4 @@ QSharedPointer<IpcProcessInterfaceReplica> IpcClient::CreatePrivilegedProcess()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
IpcClient::IpcClient(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
m_localSocket.reset(new QLocalSocket(this));
|
|
||||||
connect(m_localSocket.data(), &QLocalSocket::connected, &m_ClientNode, [this]() {
|
|
||||||
m_ClientNode.addClientSideConnection(m_localSocket.data());
|
|
||||||
|
|
||||||
m_ipcClient.reset(m_ClientNode.acquire<IpcInterfaceReplica>());
|
|
||||||
m_ipcClient->waitForSource(1000);
|
|
||||||
|
|
||||||
if (!m_ipcClient->isReplicaValid()) {
|
|
||||||
qWarning() << "IpcClient replica is not connected!";
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
m_localSocket->connectToServer(amnezia::getIpcServiceUrl());
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -19,19 +19,23 @@ class IpcClient : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static IpcClient &Instance();
|
explicit IpcClient(QObject *parent = nullptr);
|
||||||
static bool init();
|
|
||||||
static QSharedPointer<IpcInterfaceReplica> Interface() { return Instance().m_ipcClient; }
|
static IpcClient *Instance();
|
||||||
|
static bool init(IpcClient *instance);
|
||||||
|
static QSharedPointer<IpcInterfaceReplica> Interface();
|
||||||
static QSharedPointer<IpcProcessInterfaceReplica> CreatePrivilegedProcess();
|
static QSharedPointer<IpcProcessInterfaceReplica> CreatePrivilegedProcess();
|
||||||
|
|
||||||
|
bool isSocketConnected() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit IpcClient(QObject *parent = nullptr);
|
~IpcClient() override;
|
||||||
|
|
||||||
QRemoteObjectNode m_ClientNode;
|
QRemoteObjectNode m_ClientNode;
|
||||||
QSharedPointer<IpcInterfaceReplica> m_ipcClient;
|
QSharedPointer<IpcInterfaceReplica> m_ipcClient;
|
||||||
QSharedPointer<QLocalSocket> m_localSocket;
|
QPointer<QLocalSocket> m_localSocket;
|
||||||
|
|
||||||
struct ProcessDescriptor {
|
struct ProcessDescriptor {
|
||||||
ProcessDescriptor () {
|
ProcessDescriptor () {
|
||||||
|
|
@ -45,6 +49,9 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
QMap<int, QSharedPointer<ProcessDescriptor>> m_processNodes;
|
QMap<int, QSharedPointer<ProcessDescriptor>> m_processNodes;
|
||||||
|
bool m_isSocketConnected {false};
|
||||||
|
|
||||||
|
static IpcClient *m_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // IPCCLIENT_H
|
#endif // IPCCLIENT_H
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,8 @@ int main(int argc, char *argv[])
|
||||||
app.setQuitOnLastWindowClosed(false);
|
app.setQuitOnLastWindowClosed(false);
|
||||||
|
|
||||||
qRegisterMetaType<VpnProtocol::ConnectionState>("VpnProtocol::ConnectionState");
|
qRegisterMetaType<VpnProtocol::ConnectionState>("VpnProtocol::ConnectionState");
|
||||||
|
qRegisterMetaType<ServerCredentials>("ServerCredentials");
|
||||||
|
|
||||||
qRegisterMetaType<DockerContainer>("DockerContainer");
|
qRegisterMetaType<DockerContainer>("DockerContainer");
|
||||||
qRegisterMetaType<TransportProto>("TransportProto");
|
qRegisterMetaType<TransportProto>("TransportProto");
|
||||||
qRegisterMetaType<Protocol>("Protocol");
|
qRegisterMetaType<Protocol>("Protocol");
|
||||||
|
|
@ -128,7 +130,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
UiLogic *uiLogic = new UiLogic;
|
UiLogic *uiLogic = new UiLogic;
|
||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine *engine = new QQmlApplicationEngine;
|
||||||
|
|
||||||
declareQmlPageEnum();
|
declareQmlPageEnum();
|
||||||
declareQmlProtocolEnum();
|
declareQmlProtocolEnum();
|
||||||
|
|
@ -141,29 +143,37 @@ int main(int argc, char *argv[])
|
||||||
qmlRegisterSingletonInstance("ProtocolProps", 1, 0, "ProtocolProps", protocolProps.get());
|
qmlRegisterSingletonInstance("ProtocolProps", 1, 0, "ProtocolProps", protocolProps.get());
|
||||||
|
|
||||||
const QUrl url(QStringLiteral("qrc:/ui/qml/main.qml"));
|
const QUrl url(QStringLiteral("qrc:/ui/qml/main.qml"));
|
||||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
QObject::connect(engine, &QQmlApplicationEngine::objectCreated,
|
||||||
&app, [url](QObject *obj, const QUrl &objUrl) {
|
&app, [url](QObject *obj, const QUrl &objUrl) {
|
||||||
if (!obj && url == objUrl)
|
if (!obj && url == objUrl)
|
||||||
QCoreApplication::exit(-1);
|
QCoreApplication::exit(-1);
|
||||||
}, Qt::QueuedConnection);
|
}, Qt::QueuedConnection);
|
||||||
|
|
||||||
engine.rootContext()->setContextProperty("UiLogic", uiLogic);
|
engine->rootContext()->setContextProperty("UiLogic", uiLogic);
|
||||||
|
|
||||||
engine.rootContext()->setContextProperty("AppSettingsLogic", uiLogic->appSettingsLogic());
|
engine->rootContext()->setContextProperty("AppSettingsLogic", uiLogic->appSettingsLogic());
|
||||||
engine.rootContext()->setContextProperty("GeneralSettingsLogic", uiLogic->generalSettingsLogic());
|
engine->rootContext()->setContextProperty("GeneralSettingsLogic", uiLogic->generalSettingsLogic());
|
||||||
engine.rootContext()->setContextProperty("NetworkSettingsLogic", uiLogic->networkSettingsLogic());
|
engine->rootContext()->setContextProperty("NetworkSettingsLogic", uiLogic->networkSettingsLogic());
|
||||||
engine.rootContext()->setContextProperty("ServerConfiguringProgressLogic", uiLogic->serverConfiguringProgressLogic());
|
engine->rootContext()->setContextProperty("ServerConfiguringProgressLogic", uiLogic->serverConfiguringProgressLogic());
|
||||||
engine.rootContext()->setContextProperty("NewServerProtocolsLogic", uiLogic->newServerProtocolsLogic());
|
engine->rootContext()->setContextProperty("NewServerProtocolsLogic", uiLogic->newServerProtocolsLogic());
|
||||||
engine.rootContext()->setContextProperty("ServerListLogic", uiLogic->serverListLogic());
|
engine->rootContext()->setContextProperty("ServerListLogic", uiLogic->serverListLogic());
|
||||||
engine.rootContext()->setContextProperty("ServerSettingsLogic", uiLogic->serverSettingsLogic());
|
engine->rootContext()->setContextProperty("ServerSettingsLogic", uiLogic->serverSettingsLogic());
|
||||||
engine.rootContext()->setContextProperty("ServerContainersLogic", uiLogic->serverVpnProtocolsLogic());
|
engine->rootContext()->setContextProperty("ServerContainersLogic", uiLogic->serverVpnProtocolsLogic());
|
||||||
engine.rootContext()->setContextProperty("ShareConnectionLogic", uiLogic->shareConnectionLogic());
|
engine->rootContext()->setContextProperty("ShareConnectionLogic", uiLogic->shareConnectionLogic());
|
||||||
engine.rootContext()->setContextProperty("SitesLogic", uiLogic->sitesLogic());
|
engine->rootContext()->setContextProperty("SitesLogic", uiLogic->sitesLogic());
|
||||||
engine.rootContext()->setContextProperty("StartPageLogic", uiLogic->startPageLogic());
|
engine->rootContext()->setContextProperty("StartPageLogic", uiLogic->startPageLogic());
|
||||||
engine.rootContext()->setContextProperty("VpnLogic", uiLogic->vpnLogic());
|
engine->rootContext()->setContextProperty("VpnLogic", uiLogic->vpnLogic());
|
||||||
engine.rootContext()->setContextProperty("WizardLogic", uiLogic->wizardLogic());
|
engine->rootContext()->setContextProperty("WizardLogic", uiLogic->wizardLogic());
|
||||||
|
|
||||||
engine.load(url);
|
engine->load(url);
|
||||||
|
|
||||||
|
QObject::connect(&app, &QCoreApplication::aboutToQuit, uiLogic, [&engine, uiLogic](){
|
||||||
|
QObject::disconnect(engine, 0,0,0);
|
||||||
|
delete engine;
|
||||||
|
|
||||||
|
QObject::disconnect(uiLogic, 0,0,0);
|
||||||
|
delete uiLogic;
|
||||||
|
});
|
||||||
|
|
||||||
// TODO - fix
|
// TODO - fix
|
||||||
//#ifdef Q_OS_WIN
|
//#ifdef Q_OS_WIN
|
||||||
|
|
|
||||||
|
|
@ -39,26 +39,15 @@ Ikev2Protocol::~Ikev2Protocol()
|
||||||
|
|
||||||
void Ikev2Protocol::stop()
|
void Ikev2Protocol::stop()
|
||||||
{
|
{
|
||||||
|
setConnectionState(VpnProtocol::Disconnecting);
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
{
|
{
|
||||||
//setConnectionState(Disconnecting);
|
|
||||||
|
|
||||||
//auto disconnectProcess = new QProcess;
|
|
||||||
|
|
||||||
// disconnectProcess->setProgram("rasdial");
|
|
||||||
// QString arguments = QString("\"%1\" /disconnect")
|
|
||||||
// .arg(tunnelName());
|
|
||||||
// disconnectProcess->setNativeArguments(arguments);
|
|
||||||
|
|
||||||
// // connect(connectProcess, &QProcess::readyRead, [connectProcess]() {
|
|
||||||
// // qDebug().noquote() << "connectProcess readyRead" << connectProcess->readAll();
|
|
||||||
// // });
|
|
||||||
|
|
||||||
// disconnectProcess->start();
|
|
||||||
// disconnectProcess->waitForFinished(5000);
|
|
||||||
// setConnectionState(Disconnected);
|
|
||||||
if (! disconnect_vpn() ){
|
if (! disconnect_vpn() ){
|
||||||
qDebug()<<"We don't disconnect";
|
qDebug()<<"We don't disconnect";
|
||||||
|
setConnectionState(VpnProtocol::Error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setConnectionState(VpnProtocol::Disconnected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -440,12 +429,11 @@ bool Ikev2Protocol::disconnect_vpn(){
|
||||||
if ( RasHangUp(hRasConn) != ERROR_SUCCESS)
|
if ( RasHangUp(hRasConn) != ERROR_SUCCESS)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(3));
|
QThread::msleep(3000);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Q_OS_WINDOWS
|
|
||||||
void WINAPI RasDialFuncCallback(UINT unMsg,
|
void WINAPI RasDialFuncCallback(UINT unMsg,
|
||||||
RASCONNSTATE rasconnstate,
|
RASCONNSTATE rasconnstate,
|
||||||
DWORD dwError ){
|
DWORD dwError ){
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,9 @@ VpnLogic::VpnLogic(UiLogic *logic, QObject *parent):
|
||||||
connect(uiLogic()->m_vpnConnection, &VpnConnection::connectionStateChanged, this, &VpnLogic::onConnectionStateChanged);
|
connect(uiLogic()->m_vpnConnection, &VpnConnection::connectionStateChanged, this, &VpnLogic::onConnectionStateChanged);
|
||||||
connect(uiLogic()->m_vpnConnection, &VpnConnection::vpnProtocolError, this, &VpnLogic::onVpnProtocolError);
|
connect(uiLogic()->m_vpnConnection, &VpnConnection::vpnProtocolError, this, &VpnLogic::onVpnProtocolError);
|
||||||
|
|
||||||
|
connect(this, &VpnLogic::connectToVpn, uiLogic()->m_vpnConnection, &VpnConnection::connectToVpn, Qt::QueuedConnection);
|
||||||
|
connect(this, &VpnLogic::disconnectFromVpn, uiLogic()->m_vpnConnection, &VpnConnection::disconnectFromVpn, Qt::QueuedConnection);
|
||||||
|
|
||||||
if (m_settings.isAutoConnect() && m_settings.defaultServerIndex() >= 0) {
|
if (m_settings.isAutoConnect() && m_settings.defaultServerIndex() >= 0) {
|
||||||
QTimer::singleShot(1000, this, [this](){
|
QTimer::singleShot(1000, this, [this](){
|
||||||
set_pushButtonConnectEnabled(false);
|
set_pushButtonConnectEnabled(false);
|
||||||
|
|
@ -166,20 +169,19 @@ void VpnLogic::onConnectWorker(int serverIndex, const ServerCredentials &credent
|
||||||
|
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
|
|
||||||
ErrorCode errorCode = uiLogic()->m_vpnConnection->connectToVpn(
|
emit connectToVpn(serverIndex, credentials, container, containerConfig);
|
||||||
serverIndex, credentials, container, containerConfig);
|
|
||||||
|
|
||||||
if (errorCode) {
|
// if (errorCode) {
|
||||||
//ui->pushButton_connect->setChecked(false);
|
// //ui->pushButton_connect->setChecked(false);
|
||||||
uiLogic()->setDialogConnectErrorText(errorString(errorCode));
|
// uiLogic()->setDialogConnectErrorText(errorString(errorCode));
|
||||||
emit uiLogic()->showConnectErrorDialog();
|
// emit uiLogic()->showConnectErrorDialog();
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VpnLogic::onDisconnect()
|
void VpnLogic::onDisconnect()
|
||||||
{
|
{
|
||||||
set_pushButtonConnectChecked(false);
|
set_pushButtonConnectChecked(false);
|
||||||
uiLogic()->m_vpnConnection->disconnectFromVpn();
|
emit disconnectFromVpn();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,5 +48,10 @@ public slots:
|
||||||
void onConnectionStateChanged(VpnProtocol::ConnectionState state);
|
void onConnectionStateChanged(VpnProtocol::ConnectionState state);
|
||||||
void onVpnProtocolError(amnezia::ErrorCode errorCode);
|
void onVpnProtocolError(amnezia::ErrorCode errorCode);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void connectToVpn(int serverIndex,
|
||||||
|
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
|
||||||
|
|
||||||
|
void disconnectFromVpn();
|
||||||
};
|
};
|
||||||
#endif // VPN_LOGIC_H
|
#endif // VPN_LOGIC_H
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,9 @@ UiLogic::UiLogic(QObject *parent) :
|
||||||
{
|
{
|
||||||
m_containersModel = new ContainersModel(this);
|
m_containersModel = new ContainersModel(this);
|
||||||
m_protocolsModel = new ProtocolsModel(this);
|
m_protocolsModel = new ProtocolsModel(this);
|
||||||
m_vpnConnection = new VpnConnection(this);
|
m_vpnConnection = new VpnConnection();
|
||||||
|
m_vpnConnection->moveToThread(&m_vpnConnectionThread);
|
||||||
|
m_vpnConnectionThread.start();
|
||||||
|
|
||||||
m_appSettingsLogic = new AppSettingsLogic(this);
|
m_appSettingsLogic = new AppSettingsLogic(this);
|
||||||
m_generalSettingsLogic = new GeneralSettingsLogic(this);
|
m_generalSettingsLogic = new GeneralSettingsLogic(this);
|
||||||
|
|
@ -264,7 +266,9 @@ void UiLogic::setDialogConnectErrorText(const QString &dialogConnectErrorText)
|
||||||
|
|
||||||
UiLogic::~UiLogic()
|
UiLogic::~UiLogic()
|
||||||
{
|
{
|
||||||
hide();
|
emit hide();
|
||||||
|
|
||||||
|
if (m_vpnConnection->connectionState() != VpnProtocol::ConnectionState::Disconnected) {
|
||||||
m_vpnConnection->disconnectFromVpn();
|
m_vpnConnection->disconnectFromVpn();
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
|
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
|
|
@ -273,7 +277,10 @@ UiLogic::~UiLogic()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_vpnConnectionThread.quit();
|
||||||
|
m_vpnConnectionThread.wait(3000);
|
||||||
delete m_vpnConnection;
|
delete m_vpnConnection;
|
||||||
|
|
||||||
qDebug() << "Application closed";
|
qDebug() << "Application closed";
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include "property_helper.h"
|
#include "property_helper.h"
|
||||||
#include "pages.h"
|
#include "pages.h"
|
||||||
|
|
@ -210,6 +211,7 @@ private:
|
||||||
QMap<Protocol, PageProtocolLogicBase *> m_protocolLogicMap;
|
QMap<Protocol, PageProtocolLogicBase *> m_protocolLogicMap;
|
||||||
|
|
||||||
VpnConnection* m_vpnConnection;
|
VpnConnection* m_vpnConnection;
|
||||||
|
QThread m_vpnConnectionThread;
|
||||||
Settings m_settings;
|
Settings m_settings;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,7 @@
|
||||||
|
|
||||||
VpnConnection::VpnConnection(QObject* parent) : QObject(parent)
|
VpnConnection::VpnConnection(QObject* parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
QTimer::singleShot(0, this, [this](){
|
|
||||||
if (!IpcClient::init()) {
|
|
||||||
qWarning() << "Error occured when init IPC client";
|
|
||||||
emit serviceIsNotReady();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VpnConnection::~VpnConnection()
|
VpnConnection::~VpnConnection()
|
||||||
|
|
@ -190,10 +185,6 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex,
|
||||||
|
|
||||||
|
|
||||||
for (ProtocolEnumNS::Protocol proto : ContainerProps::protocolsForContainer(container)) {
|
for (ProtocolEnumNS::Protocol proto : ContainerProps::protocolsForContainer(container)) {
|
||||||
// QString vpnConfigData =
|
|
||||||
// createVpnConfigurationForProto(
|
|
||||||
// serverIndex, credentials, container, containerConfig, proto, &e);
|
|
||||||
|
|
||||||
QJsonObject vpnConfigData = QJsonDocument::fromJson(
|
QJsonObject vpnConfigData = QJsonDocument::fromJson(
|
||||||
createVpnConfigurationForProto(
|
createVpnConfigurationForProto(
|
||||||
serverIndex, credentials, container, containerConfig, proto, &e).toUtf8()).
|
serverIndex, credentials, container, containerConfig, proto, &e).toUtf8()).
|
||||||
|
|
@ -205,7 +196,6 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex,
|
||||||
}
|
}
|
||||||
|
|
||||||
vpnConfiguration.insert(ProtocolProps::key_proto_config_data(proto), vpnConfigData);
|
vpnConfiguration.insert(ProtocolProps::key_proto_config_data(proto), vpnConfigData);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Protocol proto = ContainerProps::defaultProtocol(container);
|
Protocol proto = ContainerProps::defaultProtocol(container);
|
||||||
|
|
@ -214,11 +204,27 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex,
|
||||||
return vpnConfiguration;
|
return vpnConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode VpnConnection::connectToVpn(int serverIndex,
|
void VpnConnection::connectToVpn(int serverIndex,
|
||||||
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig)
|
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig)
|
||||||
{
|
{
|
||||||
qDebug() << QString("СonnectToVpn, Server index is %1, container is %2, route mode is")
|
qDebug() << QString("СonnectToVpn, Server index is %1, container is %2, route mode is")
|
||||||
.arg(serverIndex).arg(ContainerProps::containerToString(container)) << m_settings.routeMode();
|
.arg(serverIndex).arg(ContainerProps::containerToString(container)) << m_settings.routeMode();
|
||||||
|
|
||||||
|
#if !defined (Q_OS_ANDROID) && !defined (Q_OS_IOS)
|
||||||
|
if (!m_IpcClient) {
|
||||||
|
m_IpcClient = new IpcClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_IpcClient->isSocketConnected()) {
|
||||||
|
if (!IpcClient::init(m_IpcClient)) {
|
||||||
|
qWarning() << "Error occured when init IPC client";
|
||||||
|
emit serviceIsNotReady();
|
||||||
|
emit connectionStateChanged(VpnProtocol::Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
m_remoteAddress = credentials.hostName;
|
m_remoteAddress = credentials.hostName;
|
||||||
|
|
||||||
emit connectionStateChanged(VpnProtocol::Connecting);
|
emit connectionStateChanged(VpnProtocol::Connecting);
|
||||||
|
|
@ -233,26 +239,26 @@ ErrorCode VpnConnection::connectToVpn(int serverIndex,
|
||||||
m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig);
|
m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig);
|
||||||
if (e) {
|
if (e) {
|
||||||
emit connectionStateChanged(VpnProtocol::Error);
|
emit connectionStateChanged(VpnProtocol::Error);
|
||||||
return e;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
|
|
||||||
m_vpnProtocol.reset(VpnProtocol::factory(container, m_vpnConfiguration));
|
m_vpnProtocol.reset(VpnProtocol::factory(container, m_vpnConfiguration));
|
||||||
if (!m_vpnProtocol) {
|
if (!m_vpnProtocol) {
|
||||||
return ErrorCode::InternalError;
|
emit VpnProtocol::Error;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_vpnProtocol->prepare();
|
m_vpnProtocol->prepare();
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
Protocol proto = ContainerProps::defaultProtocol(container);
|
Protocol proto = ContainerProps::defaultProtocol(container);
|
||||||
AndroidVpnProtocol *androidVpnProtocol = new AndroidVpnProtocol(proto, m_vpnConfiguration);
|
AndroidVpnProtocol *androidVpnProtocol = new AndroidVpnProtocol(proto, m_vpnConfiguration);
|
||||||
if (!androidVpnProtocol->initialize()) {
|
if (!androidVpnProtocol->initialize()) {
|
||||||
qDebug() << QString("Init failed") ;
|
qDebug() << QString("Init failed") ;
|
||||||
return UnknownError;
|
emit VpnProtocol::Error;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
m_vpnProtocol.reset(androidVpnProtocol);
|
m_vpnProtocol.reset(androidVpnProtocol);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -263,7 +269,8 @@ ErrorCode VpnConnection::connectToVpn(int serverIndex,
|
||||||
|
|
||||||
ServerController::disconnectFromHost(credentials);
|
ServerController::disconnectFromHost(credentials);
|
||||||
|
|
||||||
return m_vpnProtocol.data()->start();
|
e = m_vpnProtocol.data()->start();
|
||||||
|
if (e) emit VpnProtocol::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString VpnConnection::bytesPerSecToText(quint64 bytes)
|
QString VpnConnection::bytesPerSecToText(quint64 bytes)
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,7 @@ public:
|
||||||
const ServerCredentials &credentials, DockerContainer container,
|
const ServerCredentials &credentials, DockerContainer container,
|
||||||
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
|
||||||
|
|
||||||
ErrorCode connectToVpn(int serverIndex,
|
|
||||||
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
|
|
||||||
|
|
||||||
void disconnectFromVpn();
|
|
||||||
|
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
bool isDisconnected() const;
|
bool isDisconnected() const;
|
||||||
|
|
@ -51,6 +48,12 @@ public:
|
||||||
|
|
||||||
const QString &remoteAddress() const;
|
const QString &remoteAddress() const;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void connectToVpn(int serverIndex,
|
||||||
|
const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig);
|
||||||
|
|
||||||
|
void disconnectFromVpn();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
|
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
|
||||||
void connectionStateChanged(VpnProtocol::ConnectionState state);
|
void connectionStateChanged(VpnProtocol::ConnectionState state);
|
||||||
|
|
@ -70,6 +73,7 @@ private:
|
||||||
QJsonObject m_vpnConfiguration;
|
QJsonObject m_vpnConfiguration;
|
||||||
QJsonObject m_routeMode;
|
QJsonObject m_routeMode;
|
||||||
QString m_remoteAddress;
|
QString m_remoteAddress;
|
||||||
|
IpcClient *m_IpcClient {nullptr};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue