mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-05-08 14:33:23 +00:00
* fix: xray heap corruption * fix: use proper configuration for split-tunneled apps * chore: enable killswitch * chore: xray windows split-tunneling cleanup * chore: proper xray killswitch log * feat: add wait for the tun device * chore: update amnezia_xray deps for macos * fix: add nullptr check for split-tunnel on win * fix: modernize vpnAdapter grabbing function * fix: remove network watcher due to its fragileness * chore: xrayprotocol cleanup * fix: correct wrong iface index on win * chore: move tun2socks implementation to the client from the service * chore: xrayprotocol cleanup * chore: more xrayprotocol cleanup * fix: consistent tun device with GUID specified * chore: tun2socks logs * chore: PrivilegedProcess cleanup * better error handling in establishment phase * terminate&kill ops for remote process * fix: straighforward killing the process on windows * fix: finally remove GUID setting from tun2socks due to instability * fix: add sanitizer to ipc process * chore: do not collect sensitive info from tun2socks
75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
#include "ipcclient.h"
|
|
#include "ipc.h"
|
|
#include <QRemoteObjectNode>
|
|
#include <QtNetwork/qlocalsocket.h>
|
|
|
|
IpcClient::IpcClient(QObject *parent) : QObject(parent)
|
|
{
|
|
m_node.connectToNode(QUrl("local:" + amnezia::getIpcServiceUrl()));
|
|
m_interface.reset(m_node.acquire<IpcInterfaceReplica>());
|
|
}
|
|
|
|
IpcClient& IpcClient::Instance()
|
|
{
|
|
thread_local IpcClient ipcClient;
|
|
return ipcClient;
|
|
}
|
|
|
|
QSharedPointer<IpcInterfaceReplica> IpcClient::Interface()
|
|
{
|
|
QSharedPointer<IpcInterfaceReplica> rep = Instance().m_interface;
|
|
if (rep.isNull()) {
|
|
qCritical() << "IpcClient::Interface(): Failed to acquire replica";
|
|
return nullptr;
|
|
}
|
|
if (!rep->waitForSource(1000)) {
|
|
qCritical() << "IpcClient::Interface(): Failed to initialize replica";
|
|
return nullptr;
|
|
}
|
|
if (!rep->isReplicaValid()) {
|
|
qWarning() << "IpcClient::Interface(): Replica is invalid";
|
|
}
|
|
return rep;
|
|
}
|
|
|
|
QSharedPointer<IpcProcessInterfaceReplica> IpcClient::CreatePrivilegedProcess()
|
|
{
|
|
return withInterface([](QSharedPointer<IpcInterfaceReplica> &iface) -> QSharedPointer<IpcProcessInterfaceReplica> {
|
|
auto createPrivilegedProcess = iface->createPrivilegedProcess();
|
|
if (!createPrivilegedProcess.waitForFinished()) {
|
|
qCritical() << "Failed to create privileged process";
|
|
return nullptr;
|
|
}
|
|
|
|
const int pid = createPrivilegedProcess.returnValue();
|
|
|
|
auto* node = new QRemoteObjectNode();
|
|
node->connectToNode(QUrl(QString("local:%1").arg(amnezia::getIpcProcessUrl(pid))));
|
|
|
|
QSharedPointer<IpcProcessInterfaceReplica> rep(
|
|
node->acquire<IpcProcessInterfaceReplica>(),
|
|
[node] (IpcProcessInterfaceReplica *ptr) {
|
|
delete ptr;
|
|
node->deleteLater();
|
|
}
|
|
);
|
|
if (rep.isNull()) {
|
|
qCritical() << "IpcClient::CreatePrivilegedProcess(): Failed to acquire replica";
|
|
return nullptr;
|
|
}
|
|
if (!rep->waitForSource()) {
|
|
qCritical() << "IpcClient::CreatePrivilegedProcess(): Failed to initialize replica";
|
|
return nullptr;
|
|
}
|
|
if (!rep->isReplicaValid()) {
|
|
qCritical() << "IpcClient::CreatePrivilegedProcess(): Replica is invalid";
|
|
return nullptr;
|
|
}
|
|
|
|
return rep;
|
|
},
|
|
[]() -> QSharedPointer<IpcProcessInterfaceReplica> {
|
|
return nullptr;
|
|
});
|
|
}
|