* refactoring: improved the performance of secure_settings * bugfix: fixed textFields on PageSetupWizardCredentials * bugfix: fixed scrolling by keys on PageSettingsApiServerInfo * chore: hide site links for ios (#1374) * chore: fixed log output with split tunneling info * chore: hide "open logs folder" button for mobule platforms * chore: fixed again log output with split tunneling info * chore: bump version * Install apparmor (#1379) Install apparmor * chore: returned the backup page for androidTV * Enable PFS for Windows IKEv2 * refactoring: moved api info pages from ServerInfo * refactoring: moved gateway interaction functions to a separate class * bugfix: fixed storeEndpoint parsing * chore: returned links for mobile platforms * Update VPN protocol descriptions * Update VPN description texts * feature: added pages for subscription settings feature * feature: added page for export api native configs * feature: added error handling and minor ui fixes * refactor: update ios build configuration to use automatic code signing and prebuilt OpenVPNAdapter framework * feat: remove OpenVPNAdapter submodule * feat: remove ios openvpn script and associated cmake configuration * Update README.md * Update README_RU.md * Update README.md fix link * feature: added share vpn key to subscription settings page * bugfix: fixed possible crush on android * add timeouts in ipc client init * apply timeouts only for Windows * apply format to file * refactoring: simplified the validity check of the config before connection - improved project structure * bugfix: fixed visability of share drawer * feature: added 409 error handling from server response * chore: fixed android build * chore: fixed qr code display * Rewrite timeouts using waitForSource * feature: added error messages handler * feature: added issued configs info parsing * feature: added functionality to revoke api configs * chore: added links to instructions * chore: fixed qr code with vpnkey processing * chore: fixed native config post processing * chore: added link to android tv instruction * change node to IpcProcessTun2SocksReplica * chore: minor ui fixes * Update Windows OpenSSL (#1426) * Update Windows OpenSSL to 3.0.16 and add shared library for QSslSocket plugin * chore: update link to submodule 3rd-prebuild --------- Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> * chore: added 404 handling for revoke configs - added revoke before remove api server for premium v2 * chore: added log to see proxy decrypt errors * chore: minor ui fix * chore: bump version * bugfix: fixed mobile controllers initialization (#1436) * bugfix: fixed mobile controllers initialization * chore: bump version * Merge pull request #1440 from amnezia-vpn/feature/subscription-settings-page feature/subscription settings page --------- Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> Co-authored-by: pokamest <pokamest@gmail.com> Co-authored-by: Mykola Baibuz <mykola.baibuz@gmail.com> Co-authored-by: Yaroslav Yashin <yaroslav.yashin@gmail.com> Co-authored-by: KsZnak <ksu@amnezia.org> Co-authored-by: Cyril Anisimov <CyAn84@gmail.com>
132 lines
4.2 KiB
C++
132 lines
4.2 KiB
C++
#include "ipcclient.h"
|
|
#include <QRemoteObjectNode>
|
|
|
|
IpcClient *IpcClient::m_instance = nullptr;
|
|
|
|
IpcClient::IpcClient(QObject *parent) : QObject(parent)
|
|
{
|
|
}
|
|
|
|
IpcClient::~IpcClient()
|
|
{
|
|
if (m_localSocket)
|
|
m_localSocket->close();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
QSharedPointer<IpcProcessTun2SocksReplica> IpcClient::InterfaceTun2Socks()
|
|
{
|
|
if (!Instance())
|
|
return nullptr;
|
|
return Instance()->m_Tun2SocksClient;
|
|
}
|
|
|
|
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());
|
|
auto cliNode = Instance()->m_ClientNode.acquire<IpcInterfaceReplica>();
|
|
cliNode->waitForSource(5000);
|
|
Instance()->m_ipcClient.reset(cliNode);
|
|
|
|
if (!Instance()->m_ipcClient) {
|
|
qWarning() << "IpcClient is not ready!";
|
|
}
|
|
|
|
Instance()->m_ipcClient->waitForSource(1000);
|
|
|
|
if (!Instance()->m_ipcClient->isReplicaValid()) {
|
|
qWarning() << "IpcClient replica is not connected!";
|
|
}
|
|
|
|
auto t2sNode = Instance()->m_ClientNode.acquire<IpcProcessTun2SocksReplica>();
|
|
t2sNode->waitForSource(5000);
|
|
Instance()->m_Tun2SocksClient.reset(t2sNode);
|
|
|
|
if (!Instance()->m_Tun2SocksClient) {
|
|
qWarning() << "IpcClient::m_Tun2SocksClient is not ready!";
|
|
}
|
|
|
|
Instance()->m_Tun2SocksClient->waitForSource(1000);
|
|
|
|
if (!Instance()->m_Tun2SocksClient->isReplicaValid()) {
|
|
qWarning() << "IpcClient::m_Tun2SocksClient 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";
|
|
return false;
|
|
}
|
|
|
|
qDebug() << "IpcClient::init succeed";
|
|
|
|
return (Instance()->m_ipcClient->isReplicaValid() && Instance()->m_Tun2SocksClient->isReplicaValid());
|
|
}
|
|
|
|
QSharedPointer<PrivilegedProcess> IpcClient::CreatePrivilegedProcess()
|
|
{
|
|
if (!Instance()->m_ipcClient || !Instance()->m_ipcClient->isReplicaValid()) {
|
|
qWarning() << "IpcClient::createPrivilegedProcess : IpcClient IpcClient replica is not valid";
|
|
return nullptr;
|
|
}
|
|
|
|
QRemoteObjectPendingReply<int> futureResult = Instance()->m_ipcClient->createPrivilegedProcess();
|
|
futureResult.waitForFinished(5000);
|
|
|
|
int pid = futureResult.returnValue();
|
|
|
|
auto pd = QSharedPointer<ProcessDescriptor>(new ProcessDescriptor());
|
|
Instance()->m_processNodes.insert(pid, pd);
|
|
|
|
pd->localSocket.reset(new QLocalSocket(pd->replicaNode.data()));
|
|
|
|
connect(pd->localSocket.data(), &QLocalSocket::connected, pd->replicaNode.data(), [pd]() {
|
|
pd->replicaNode->addClientSideConnection(pd->localSocket.data());
|
|
|
|
IpcProcessInterfaceReplica *repl = pd->replicaNode->acquire<IpcProcessInterfaceReplica>();
|
|
PrivilegedProcess *priv = static_cast<PrivilegedProcess *>(repl);
|
|
pd->ipcProcess.reset(priv);
|
|
if (!pd->ipcProcess) {
|
|
qWarning() << "Acquire PrivilegedProcess failed";
|
|
} else {
|
|
pd->ipcProcess->waitForSource(1000);
|
|
if (!pd->ipcProcess->isReplicaValid()) {
|
|
qWarning() << "PrivilegedProcess replica is not connected!";
|
|
}
|
|
|
|
QObject::connect(pd->ipcProcess.data(), &PrivilegedProcess::destroyed, pd->ipcProcess.data(),
|
|
[pd]() { pd->replicaNode->deleteLater(); });
|
|
}
|
|
});
|
|
pd->localSocket->connectToServer(amnezia::getIpcProcessUrl(pid));
|
|
pd->localSocket->waitForConnected();
|
|
|
|
auto processReplica = QSharedPointer<PrivilegedProcess>(pd->ipcProcess);
|
|
return processReplica;
|
|
}
|