Compare commits

...

23 Commits

Author SHA1 Message Date
Mykola Baibuz f1ec9c5c75 use stop method for protocol disconnecect 2025-08-27 14:59:21 +03:00
Mykola Baibuz f2a9940147 change disconnect from vpn order 2025-08-27 02:43:38 +03:00
Mykola Baibuz 4f17085c99 wait for response from service before object destroy 2025-08-27 00:28:23 +03:00
Mykola Baibuz fdd2c12647 fix: add allow traffic rules on killswitch disable 2025-08-26 13:43:59 +03:00
Mykola Baibuz 066b74887e add disconnectSlots method 2025-08-24 15:25:58 +03:00
Mykola Baibuz eb95ec7cbf disconnect signals on exit before VPN disconnect 2025-08-24 15:07:52 +03:00
Mykola Baibuz e2492abb77 disconnect all signals from vpnconnection on exit 2025-08-24 14:54:02 +03:00
Mykola Baibuz e0ecfc12a9 use checktimer only for iOS 2025-08-24 14:32:01 +03:00
Mykola Baibuz b1b503b7c6 add interruption request on vpnConnectionThread 2025-08-24 14:14:11 +03:00
Mykola Baibuz 3d573d5977 disconnect all signals from vpnconnection on exit 2025-08-24 13:36:18 +03:00
Mykola Baibuz fc99da1432 Revert "Don't terminate VPN thread on Linux"
This reverts commit 20e4ea2d4a.
2025-08-22 17:22:45 +03:00
Mykola Baibuz 20e4ea2d4a Don't terminate VPN thread on Linux 2025-08-22 17:05:31 +03:00
Mykola Baibuz f0b3c16880 this object will be deleted at app close 2025-08-22 17:00:21 +03:00
Mykola Baibuz 2ac62027e8 fix: remove second disconnect from VPN on app close 2025-08-22 12:17:51 +03:00
Mykola Baibuz 43c3518f9e cleanup trace info 2025-08-21 20:56:02 +03:00
Mykola Baibuz 8b86c482d2 cleanup unused variable 2025-08-21 20:16:06 +03:00
Mykola Baibuz b4efae8edd Refactor IpcClient::Interface access logic 2025-08-21 19:56:04 +03:00
Mykola Baibuz 03bc7d6293 set timelimit for flushDns 2025-08-21 16:51:03 +03:00
Mykola Baibuz 8390a270ca add more trace info 2025-08-21 13:40:25 +03:00
Mykola Baibuz faa832b152 add trace info 2025-08-21 12:56:19 +03:00
Mykola Baibuz ed228643cf fix: typo in VpnConnection destructor 2025-08-21 12:29:37 +03:00
Mykola Baibuz ef901c2149 fix: app freeze on quit 2025-08-20 21:46:52 +03:00
Nethius 16d92ddb7c fix: UI fixes after merge with d20ed4a (#1779)
* fix: ui fixes after merge with d20ed4a

* update OpenVPN settings page

* chore: page settings dns margins

---------

Co-authored-by: Cyril Anisimov <CyAn84@gmail.com>
2025-08-11 13:40:28 +08:00
26 changed files with 521 additions and 515 deletions
+5 -3
View File
@@ -53,14 +53,16 @@ AmneziaApplication::~AmneziaApplication()
{ {
if (m_vpnConnection) { if (m_vpnConnection) {
QMetaObject::invokeMethod(m_vpnConnection.get(), "disconnectFromVpn", Qt::QueuedConnection); QMetaObject::invokeMethod(m_vpnConnection.get(), "disconnectFromVpn", Qt::QueuedConnection);
QMetaObject::invokeMethod(m_vpnConnection.get(), "deleteLater", Qt::QueuedConnection); QThread::msleep(2000);
QMetaObject::invokeMethod(m_vpnConnection.get(), "disconnectSlots", Qt::QueuedConnection);
} }
m_vpnConnectionThread.requestInterruption();
m_vpnConnectionThread.quit(); m_vpnConnectionThread.quit();
if (!m_vpnConnectionThread.wait(5000)) { if (!m_vpnConnectionThread.wait(3000)) {
m_vpnConnectionThread.terminate(); m_vpnConnectionThread.terminate();
m_vpnConnectionThread.wait(); m_vpnConnectionThread.wait(500);
} }
if (m_engine) { if (m_engine) {
+2 -1
View File
@@ -85,8 +85,9 @@ bool IpcClient::init(IpcClient *instance)
} }
qDebug() << "IpcClient::init succeed"; qDebug() << "IpcClient::init succeed";
instance->m_isSocketConnected = (Instance()->m_ipcClient->isReplicaValid() && Instance()->m_Tun2SocksClient->isReplicaValid());
return (Instance()->m_ipcClient->isReplicaValid() && Instance()->m_Tun2SocksClient->isReplicaValid()); return Instance()->isSocketConnected();
} }
QSharedPointer<PrivilegedProcess> IpcClient::CreatePrivilegedProcess() QSharedPointer<PrivilegedProcess> IpcClient::CreatePrivilegedProcess()
+2 -1
View File
@@ -56,7 +56,8 @@ void OpenVpnProtocol::stop()
} }
#if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS) #if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
IpcClient::Interface()->disableKillSwitch(); QRemoteObjectPendingReply<bool> disableKillSwitchResp = IpcClient::Interface()->disableKillSwitch();
disableKillSwitchResp.waitForFinished(1000);
#endif #endif
setConnectionState(Vpn::ConnectionState::Disconnected); setConnectionState(Vpn::ConnectionState::Disconnected);
+5 -2
View File
@@ -167,8 +167,10 @@ ErrorCode XrayProtocol::startTun2Sock()
void XrayProtocol::stop() void XrayProtocol::stop()
{ {
#if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS) #if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
IpcClient::Interface()->disableKillSwitch(); QRemoteObjectPendingReply<bool> disableKillSwitchResp = IpcClient::Interface()->disableKillSwitch();
IpcClient::Interface()->StartRoutingIpv6(); disableKillSwitchResp.waitForFinished(1000);
QRemoteObjectPendingReply<bool> StartRoutingIpv6Resp = IpcClient::Interface()->StartRoutingIpv6();
StartRoutingIpv6Resp.waitForFinished(1000);
#endif #endif
qDebug() << "XrayProtocol::stop()"; qDebug() << "XrayProtocol::stop()";
m_xrayProcess.disconnect(); m_xrayProcess.disconnect();
@@ -176,6 +178,7 @@ void XrayProtocol::stop()
m_xrayProcess.waitForFinished(3000); m_xrayProcess.waitForFinished(3000);
if (m_t2sProcess) { if (m_t2sProcess) {
m_t2sProcess->stop(); m_t2sProcess->stop();
QThread::msleep(200);
} }
setConnectionState(Vpn::ConnectionState::Disconnected); setConnectionState(Vpn::ConnectionState::Disconnected);
@@ -34,7 +34,7 @@ PageType {
ListViewType { ListViewType {
id: listView id: listView
anchors.top: backButtonLayout.bottom anchors.top: backButton.bottom
anchors.bottom: saveButton.top anchors.bottom: saveButton.top
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
@@ -37,7 +37,7 @@ PageType {
ListViewType { ListViewType {
id: listView id: listView
anchors.top: backButtonLayout.bottom anchors.top: backButton.bottom
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@@ -17,85 +17,65 @@ import "../Components"
PageType { PageType {
id: root id: root
ColumnLayout {
id: backButtonLayout
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 20
BackButtonType { BackButtonType {
id: backButton id: backButton
}
}
FlickableType {
id: fl
anchors.top: backButtonLayout.bottom
anchors.bottom: parent.bottom
contentHeight: content.implicitHeight
Column {
id: content
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.topMargin: 20
onActiveFocusChanged: {
if(backButton.enabled && backButton.activeFocus) {
listView.positionViewAtBeginning()
}
}
}
ListViewType {
id: listView
anchors.top: backButton.bottom
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: parent.left
enabled: ServersModel.isProcessedServerHasWriteAccess() enabled: ServersModel.isProcessedServerHasWriteAccess()
ListView { header: ColumnLayout {
id: listview width: listView.width
width: parent.width BaseHeaderType {
height: listview.contentItem.height id: header
clip: true Layout.fillWidth: true
interactive: false Layout.rightMargin: 16
Layout.leftMargin: 16
headerText: qsTr("OpenVPN Settings")
}
}
model: OpenVpnConfigModel model: OpenVpnConfigModel
delegate: Item { delegate: ColumnLayout {
id: delegateItem width: listView.width
property alias vpnAddressSubnetTextField: vpnAddressSubnetTextField
property bool isEnabled: ServersModel.isProcessedServerHasWriteAccess()
implicitWidth: listview.width
implicitHeight: col.implicitHeight
ColumnLayout {
id: col
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 16
anchors.rightMargin: 16
spacing: 0 spacing: 0
BaseHeaderType {
Layout.fillWidth: true
headerText: qsTr("OpenVPN settings")
}
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: vpnAddressSubnetTextField id: vpnAddressSubnetTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: delegateItem.isEnabled enabled: listView.enabled
headerText: qsTr("VPN address subnet") headerText: qsTr("VPN address subnet")
textField.text: subnetAddress textField.text: subnetAddress
parentFlickable: fl
textField.onEditingFinished: { textField.onEditingFinished: {
if (textField.text !== subnetAddress) { if (textField.text !== subnetAddress) {
subnetAddress = textField.text subnetAddress = textField.text
@@ -108,6 +88,8 @@ PageType {
ParagraphTextType { ParagraphTextType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Network protocol") text: qsTr("Network protocol")
} }
@@ -116,6 +98,9 @@ PageType {
id: transportProtoSelector id: transportProtoSelector
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
rootWidth: root.width rootWidth: root.width
enabled: isTransportProtoEditable enabled: isTransportProtoEditable
@@ -138,9 +123,10 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 40 Layout.topMargin: 40
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: delegateItem.isEnabled enabled: listView.enabled
headerText: qsTr("Port") headerText: qsTr("Port")
textField.text: port textField.text: port
@@ -161,7 +147,8 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Auto-negotiate encryption") text: qsTr("Auto-negotiate encryption")
checked: autoNegotiateEncryprion checked: autoNegotiateEncryprion
@@ -177,6 +164,8 @@ PageType {
id: hashDropDown id: hashDropDown
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 20 Layout.topMargin: 20
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: !autoNegotiateEncryprionSwitcher.checked enabled: !autoNegotiateEncryprionSwitcher.checked
@@ -225,6 +214,8 @@ PageType {
id: cipherDropDown id: cipherDropDown
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: !autoNegotiateEncryprionSwitcher.checked enabled: !autoNegotiateEncryprionSwitcher.checked
@@ -273,25 +264,18 @@ PageType {
id: contentRect id: contentRect
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
Layout.leftMargin: 16
Layout.rightMargin: 16
Layout.preferredHeight: checkboxLayout.implicitHeight Layout.preferredHeight: checkboxLayout.implicitHeight
color: AmneziaStyle.color.onyxBlack color: AmneziaStyle.color.onyxBlack
radius: 16 radius: 16
Connections {
target: tlsAuthCheckBox
enabled: !GC.isMobile()
function onFocusChanged() {
if (tlsAuthCheckBox.activeFocus) {
fl.ensureVisible(contentRect)
}
}
}
ColumnLayout { ColumnLayout {
id: checkboxLayout id: checkboxLayout
anchors.fill: parent anchors.fill: parent
CheckBoxType { CheckBoxType {
id: tlsAuthCheckBox id: tlsAuthCheckBox
Layout.fillWidth: true Layout.fillWidth: true
@@ -329,7 +313,8 @@ PageType {
id: additionalClientCommandsSwitcher id: additionalClientCommandsSwitcher
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 32 Layout.topMargin: 32
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
checked: additionalClientCommands !== "" checked: additionalClientCommands !== ""
@@ -346,11 +331,11 @@ PageType {
id: additionalClientCommandsTextArea id: additionalClientCommandsTextArea
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: additionalClientCommandsSwitcher.checked visible: additionalClientCommandsSwitcher.checked
parentFlickable: fl
textAreaText: additionalClientCommands textAreaText: additionalClientCommands
placeholderText: qsTr("Commands:") placeholderText: qsTr("Commands:")
@@ -365,7 +350,8 @@ PageType {
id: additionalServerCommandsSwitcher id: additionalServerCommandsSwitcher
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
parentFlickable: fl Layout.leftMargin: 16
Layout.rightMargin: 16
checked: additionalServerCommands !== "" checked: additionalServerCommands !== ""
@@ -382,12 +368,14 @@ PageType {
id: additionalServerCommandsTextArea id: additionalServerCommandsTextArea
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: additionalServerCommandsSwitcher.checked visible: additionalServerCommandsSwitcher.checked
textAreaText: additionalServerCommands textAreaText: additionalServerCommands
placeholderText: qsTr("Commands:") placeholderText: qsTr("Commands:")
parentFlickable: fl
textArea.onEditingFinished: { textArea.onEditingFinished: {
if (additionalServerCommands !== textAreaText) { if (additionalServerCommands !== textAreaText) {
additionalServerCommands = textAreaText additionalServerCommands = textAreaText
@@ -401,12 +389,13 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
Layout.bottomMargin: 24 Layout.bottomMargin: 24
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: vpnAddressSubnetTextField.errorText === "" && enabled: vpnAddressSubnetTextField.errorText === "" &&
portTextField.errorText === "" portTextField.errorText === ""
text: qsTr("Save") text: qsTr("Save")
parentFlickable: fl
onClicked: function() { onClicked: function() {
forceActiveFocus() forceActiveFocus()
@@ -438,7 +427,4 @@ PageType {
} }
} }
} }
}
}
}
} }
@@ -66,8 +66,6 @@ PageType {
Layout.leftMargin: 16 Layout.leftMargin: 16
Layout.rightMargin: 16 Layout.rightMargin: 16
enabled: delegateItem.isEnabled
headerText: qsTr("VPN address subnet") headerText: qsTr("VPN address subnet")
textField.text: subnetAddress textField.text: subnetAddress
@@ -87,8 +85,6 @@ PageType {
Layout.leftMargin: 16 Layout.leftMargin: 16
Layout.rightMargin: 16 Layout.rightMargin: 16
enabled: delegateItem.isEnabled
headerText: qsTr("Port") headerText: qsTr("Port")
textField.text: port textField.text: port
textField.maximumLength: 5 textField.maximumLength: 5
-4
View File
@@ -43,8 +43,6 @@ PageType {
LabelWithButtonType { LabelWithButtonType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: isVisible visible: isVisible
@@ -68,8 +66,6 @@ PageType {
visible: GC.isDesktop() visible: GC.isDesktop()
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: 16
Layout.rightMargin: 16
text: qsTr("Close application") text: qsTr("Close application")
leftImageSource: "qrc:/images/controls/x-circle.svg" leftImageSource: "qrc:/images/controls/x-circle.svg"
+7 -11
View File
@@ -66,6 +66,13 @@ PageType {
text: qsTr("If AmneziaDNS is not used or installed") text: qsTr("If AmneziaDNS is not used or installed")
} }
}
model: 1 // fake model to force the ListView to be created without a model
delegate: ColumnLayout {
width: listView.width
spacing: 16
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: primaryDns id: primaryDns
@@ -96,13 +103,6 @@ PageType {
regularExpression: InstallController.ipAddressRegExp() regularExpression: InstallController.ipAddressRegExp()
} }
} }
}
model: 1 // fake model to force the ListView to be created without a model
spacing: 16
delegate: ColumnLayout {
width: listView.width
BasicButtonType { BasicButtonType {
id: restoreDefaultButton id: restoreDefaultButton
@@ -139,10 +139,6 @@ PageType {
showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
} }
} }
}
footer: ColumnLayout {
width: listView.width
BasicButtonType { BasicButtonType {
id: saveButton id: saveButton
@@ -18,6 +18,8 @@ PageType {
signal lastItemTabClickedSignal() signal lastItemTabClickedSignal()
property bool isServerWithWriteAccess: ServersModel.isProcessedServerHasWriteAccess()
Connections { Connections {
target: InstallController target: InstallController
@@ -59,15 +61,13 @@ PageType {
target: ServersModel target: ServersModel
function onProcessedServerIndexChanged() { function onProcessedServerIndexChanged() {
listView.isServerWithWriteAccess = ServersModel.isProcessedServerHasWriteAccess() root.isServerWithWriteAccess = ServersModel.isProcessedServerHasWriteAccess()
} }
} }
ListViewType { ListViewType {
id: listView id: listView
property bool isServerWithWriteAccess: ServersModel.isProcessedServerHasWriteAccess()
anchors.fill: parent anchors.fill: parent
model: serverActions model: serverActions
@@ -107,7 +107,7 @@ PageType {
QtObject { QtObject {
id: check id: check
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Check the server for previously installed Amnezia services") readonly property string title: qsTr("Check the server for previously installed Amnezia services")
readonly property string description: qsTr("Add them to the application if they were not displayed") readonly property string description: qsTr("Add them to the application if they were not displayed")
readonly property var tColor: AmneziaStyle.color.paleGray readonly property var tColor: AmneziaStyle.color.paleGray
@@ -121,7 +121,7 @@ PageType {
QtObject { QtObject {
id: reboot id: reboot
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Reboot server") readonly property string title: qsTr("Reboot server")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -181,7 +181,7 @@ PageType {
QtObject { QtObject {
id: clear id: clear
property bool isVisible: true property bool isVisible: root.isServerWithWriteAccess
readonly property string title: qsTr("Clear server from Amnezia software") readonly property string title: qsTr("Clear server from Amnezia software")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -240,7 +240,7 @@ PageType {
QtObject { QtObject {
id: switch_to_premium id: switch_to_premium
property bool isVisible: ServersModel.getProcessedServerData("isServerFromTelegramApi") property bool isVisible: ServersModel.getProcessedServerData("isServerFromTelegramApi") && ServersModel.processedServerIsPremium
readonly property string title: qsTr("Switch to the new Amnezia Premium subscription") readonly property string title: qsTr("Switch to the new Amnezia Premium subscription")
readonly property string description: "" readonly property string description: ""
readonly property var tColor: AmneziaStyle.color.vibrantRed readonly property var tColor: AmneziaStyle.color.vibrantRed
@@ -161,10 +161,4 @@ PageType {
} }
} }
} }
ShareConnectionDrawer {
id: shareConnectionDrawer
anchors.fill: parent
}
} }
+45 -36
View File
@@ -32,8 +32,8 @@
VpnConnection::VpnConnection(std::shared_ptr<Settings> settings, QObject *parent) VpnConnection::VpnConnection(std::shared_ptr<Settings> settings, QObject *parent)
: QObject(parent), m_settings(settings), m_checkTimer(new QTimer(this)) : QObject(parent), m_settings(settings), m_checkTimer(new QTimer(this))
{ {
m_checkTimer.setInterval(1000);
#if defined(Q_OS_IOS) || defined(MACOS_NE) #if defined(Q_OS_IOS) || defined(MACOS_NE)
m_checkTimer.setInterval(1000);
connect(IosController::Instance(), &IosController::connectionStateChanged, this, &VpnConnection::onConnectionStateChanged); connect(IosController::Instance(), &IosController::connectionStateChanged, this, &VpnConnection::onConnectionStateChanged);
connect(IosController::Instance(), &IosController::bytesChanged, this, &VpnConnection::onBytesChanged); connect(IosController::Instance(), &IosController::bytesChanged, this, &VpnConnection::onBytesChanged);
@@ -42,9 +42,6 @@ VpnConnection::VpnConnection(std::shared_ptr<Settings> settings, QObject *parent
VpnConnection::~VpnConnection() VpnConnection::~VpnConnection()
{ {
#if defined AMNEZIA_DESKTOP
disconnectFromVpn();
#endif
} }
void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes) void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes)
@@ -55,19 +52,7 @@ void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes)
void VpnConnection::onKillSwitchModeChanged(bool enabled) void VpnConnection::onKillSwitchModeChanged(bool enabled)
{ {
#ifdef AMNEZIA_DESKTOP #ifdef AMNEZIA_DESKTOP
if (!m_IpcClient) { if (InterfaceReady()) {
m_IpcClient = new IpcClient(this);
}
if (!m_IpcClient->isSocketConnected()) {
if (!IpcClient::init(m_IpcClient)) {
qWarning() << "Error occurred when init IPC client";
emit serviceIsNotReady();
return;
}
}
if (IpcClient::Interface()) {
qDebug() << "Set KillSwitch Strict mode enabled " << enabled; qDebug() << "Set KillSwitch Strict mode enabled " << enabled;
IpcClient::Interface()->refreshKillSwitch(enabled); IpcClient::Interface()->refreshKillSwitch(enabled);
} }
@@ -80,7 +65,7 @@ void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state)
#ifdef AMNEZIA_DESKTOP #ifdef AMNEZIA_DESKTOP
auto container = m_settings->defaultContainer(m_settings->defaultServerIndex()); auto container = m_settings->defaultContainer(m_settings->defaultServerIndex());
if (IpcClient::Interface()) { if (InterfaceReady()) {
if (state == Vpn::ConnectionState::Connected) { if (state == Vpn::ConnectionState::Connected) {
IpcClient::Interface()->resetIpStack(); IpcClient::Interface()->resetIpStack();
IpcClient::Interface()->flushDns(); IpcClient::Interface()->flushDns();
@@ -212,14 +197,41 @@ void VpnConnection::deleteRoutes(const QStringList &ips)
#endif #endif
} }
bool VpnConnection::InterfaceReady()
{
#ifdef AMNEZIA_DESKTOP
if (!m_IpcClient) {
m_IpcClient = new IpcClient(this);
}
if (!m_IpcClient->isSocketConnected()) {
if (!IpcClient::init(m_IpcClient)) {
qWarning() << "Error occurred when init IPC client";
emit serviceIsNotReady();
return false;
}
}
return IpcClient::Interface() != nullptr;
#endif
return true;
}
void VpnConnection::flushDns() void VpnConnection::flushDns()
{ {
#ifdef AMNEZIA_DESKTOP #ifdef AMNEZIA_DESKTOP
if (IpcClient::Interface()) if (InterfaceReady())
IpcClient::Interface()->flushDns(); IpcClient::Interface()->flushDns();
#endif #endif
} }
void VpnConnection::disconnectSlots()
{
if (m_vpnProtocol) {
m_vpnProtocol->disconnect();
}
}
ErrorCode VpnConnection::lastError() const ErrorCode VpnConnection::lastError() const
{ {
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
@@ -240,20 +252,11 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede
.arg(serverIndex) .arg(serverIndex)
.arg(ContainerProps::containerToString(container)) .arg(ContainerProps::containerToString(container))
<< m_settings->routeMode(); << m_settings->routeMode();
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
if (!m_IpcClient) {
m_IpcClient = new IpcClient(this);
}
if (!m_IpcClient->isSocketConnected()) { if (!InterfaceReady()) {
if (!IpcClient::init(m_IpcClient)) {
qWarning() << "Error occurred when init IPC client";
emit serviceIsNotReady();
emit connectionStateChanged(Vpn::ConnectionState::Error); emit connectionStateChanged(Vpn::ConnectionState::Error);
return; return;
} }
}
#endif
m_remoteAddress = NetworkUtilities::getIPAddress(credentials.hostName); m_remoteAddress = NetworkUtilities::getIPAddress(credentials.hostName);
emit connectionStateChanged(Vpn::ConnectionState::Connecting); emit connectionStateChanged(Vpn::ConnectionState::Connecting);
@@ -440,13 +443,18 @@ QString VpnConnection::bytesPerSecToText(quint64 bytes)
void VpnConnection::disconnectFromVpn() void VpnConnection::disconnectFromVpn()
{ {
#ifdef AMNEZIA_DESKTOP #ifdef AMNEZIA_DESKTOP
QString proto = m_settings->defaultContainerName(m_settings->defaultServerIndex()); if (InterfaceReady()) {
if (IpcClient::Interface()) {
IpcClient::Interface()->flushDns();
m_vpnProtocol.data()->stop();
qDebug() << "Interface is ready!";
QRemoteObjectPendingReply<bool> flushDnsResp = IpcClient::Interface()->flushDns();
flushDnsResp.waitForFinished(1000);
qDebug() << "Flushed DNS";
// delete cached routes // delete cached routes
QRemoteObjectPendingReply<bool> response = IpcClient::Interface()->clearSavedRoutes(); QRemoteObjectPendingReply<bool> clearSavedRoutesResp = IpcClient::Interface()->clearSavedRoutes();
response.waitForFinished(1000); clearSavedRoutesResp.waitForFinished(1000);
} }
#endif #endif
@@ -475,12 +483,13 @@ void VpnConnection::disconnectFromVpn()
return; return;
} }
#ifndef Q_OS_ANDROID #if !defined(Q_OS_ANDROID) && !defined(AMNEZIA_DESKTOP)
if (m_vpnProtocol) { if (m_vpnProtocol) {
m_vpnProtocol->deleteLater(); m_vpnProtocol->deleteLater();
} }
m_vpnProtocol = nullptr;
#endif #endif
m_vpnProtocol = nullptr;
} }
Vpn::ConnectionState VpnConnection::connectionState() Vpn::ConnectionState VpnConnection::connectionState()
+2
View File
@@ -56,6 +56,7 @@ public slots:
void deleteRoutes(const QStringList &ips); void deleteRoutes(const QStringList &ips);
void flushDns(); void flushDns();
void onKillSwitchModeChanged(bool enabled); void onKillSwitchModeChanged(bool enabled);
void disconnectSlots();
signals: signals:
void bytesChanged(quint64 receivedBytes, quint64 sentBytes); void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
@@ -95,6 +96,7 @@ private:
void appendSplitTunnelingConfig(); void appendSplitTunnelingConfig();
void appendKillSwitchConfig(); void appendKillSwitchConfig();
bool InterfaceReady();
}; };
#endif // VPNCONNECTION_H #endif // VPNCONNECTION_H
+3 -3
View File
@@ -12,7 +12,7 @@ class IpcInterface
SLOT( int routeAddList(const QString &gw, const QStringList &ips) ); SLOT( int routeAddList(const QString &gw, const QStringList &ips) );
SLOT( bool clearSavedRoutes() ); SLOT( bool clearSavedRoutes() );
SLOT( bool routeDeleteList(const QString &gw, const QStringList &ip) ); SLOT( bool routeDeleteList(const QString &gw, const QStringList &ip) );
SLOT( void flushDns() ); SLOT( bool flushDns() );
SLOT( void resetIpStack() ); SLOT( void resetIpStack() );
SLOT( bool checkAndInstallDriver() ); SLOT( bool checkAndInstallDriver() );
@@ -25,8 +25,8 @@ class IpcInterface
SLOT( bool createTun(const QString &dev, const QString &subnet) ); SLOT( bool createTun(const QString &dev, const QString &subnet) );
SLOT( bool deleteTun(const QString &dev) ); SLOT( bool deleteTun(const QString &dev) );
SLOT( void StartRoutingIpv6() ); SLOT( bool StartRoutingIpv6() );
SLOT( void StopRoutingIpv6() ); SLOT( bool StopRoutingIpv6() );
SLOT( bool disableKillSwitch() ); SLOT( bool disableKillSwitch() );
SLOT( bool disableAllTraffic() ); SLOT( bool disableAllTraffic() );
+5 -5
View File
@@ -83,7 +83,7 @@ bool IpcServer::routeDeleteList(const QString &gw, const QStringList &ips)
return Router::routeDeleteList(gw, ips); return Router::routeDeleteList(gw, ips);
} }
void IpcServer::flushDns() bool IpcServer::flushDns()
{ {
#ifdef MZ_DEBUG #ifdef MZ_DEBUG
qDebug() << "IpcServer::flushDns"; qDebug() << "IpcServer::flushDns";
@@ -157,13 +157,13 @@ bool IpcServer::updateResolvers(const QString &ifname, const QList<QHostAddress>
return Router::updateResolvers(ifname, resolvers); return Router::updateResolvers(ifname, resolvers);
} }
void IpcServer::StartRoutingIpv6() bool IpcServer::StartRoutingIpv6()
{ {
Router::StartRoutingIpv6(); return Router::StartRoutingIpv6();
} }
void IpcServer::StopRoutingIpv6() bool IpcServer::StopRoutingIpv6()
{ {
Router::StopRoutingIpv6(); return Router::StopRoutingIpv6();
} }
void IpcServer::setLogsEnabled(bool enabled) void IpcServer::setLogsEnabled(bool enabled)
+3 -3
View File
@@ -23,7 +23,7 @@ public:
virtual int routeAddList(const QString &gw, const QStringList &ips) override; virtual int routeAddList(const QString &gw, const QStringList &ips) override;
virtual bool clearSavedRoutes() override; virtual bool clearSavedRoutes() override;
virtual bool routeDeleteList(const QString &gw, const QStringList &ips) override; virtual bool routeDeleteList(const QString &gw, const QStringList &ips) override;
virtual void flushDns() override; virtual bool flushDns() override;
virtual void resetIpStack() override; virtual void resetIpStack() override;
virtual bool checkAndInstallDriver() override; virtual bool checkAndInstallDriver() override;
virtual QStringList getTapList() override; virtual QStringList getTapList() override;
@@ -32,8 +32,8 @@ public:
virtual void setLogsEnabled(bool enabled) override; virtual void setLogsEnabled(bool enabled) override;
virtual bool createTun(const QString &dev, const QString &subnet) override; virtual bool createTun(const QString &dev, const QString &subnet) override;
virtual bool deleteTun(const QString &dev) override; virtual bool deleteTun(const QString &dev) override;
virtual void StartRoutingIpv6() override; virtual bool StartRoutingIpv6() override;
virtual void StopRoutingIpv6() override; virtual bool StopRoutingIpv6() override;
virtual bool disableAllTraffic() override; virtual bool disableAllTraffic() override;
virtual bool addKillSwitchAllowedRange(QStringList ranges) override; virtual bool addKillSwitchAllowedRange(QStringList ranges) override;
virtual bool resetKillSwitchAllowedRange(QStringList ranges) override; virtual bool resetKillSwitchAllowedRange(QStringList ranges) override;
+11
View File
@@ -98,6 +98,17 @@ bool KillSwitch::disableKillSwitch() {
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("320.allowDNS"), false); LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("320.allowDNS"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("400.allowPIA"), false); LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("400.allowPIA"), false);
} else { } else {
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("000.allowLoopback"), true);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("100.blockAll"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("110.allowNets"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("120.blockNets"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("200.allowVPN"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv6, QStringLiteral("250.blockIPv6"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("290.allowDHCP"), true);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("300.allowLAN"), true);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("310.blockDNS"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("320.allowDNS"), false);
LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("400.allowPIA"), false);
LinuxFirewall::uninstall(); LinuxFirewall::uninstall();
} }
#endif #endif
+12 -12
View File
@@ -42,14 +42,14 @@ int Router::routeDeleteList(const QString &gw, const QStringList &ips)
#endif #endif
} }
void Router::flushDns() bool Router::flushDns()
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
RouterWin::Instance().flushDns(); return RouterWin::Instance().flushDns();
#elif defined (Q_OS_MAC) #elif defined (Q_OS_MAC)
RouterMac::Instance().flushDns(); return RouterMac::Instance().flushDns();
#elif defined Q_OS_LINUX #elif defined Q_OS_LINUX
RouterLinux::Instance().flushDns(); return RouterLinux::Instance().flushDns();
#endif #endif
} }
@@ -100,25 +100,25 @@ bool Router::updateResolvers(const QString& ifname, const QList<QHostAddress>& r
} }
void Router::StopRoutingIpv6() bool Router::StopRoutingIpv6()
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
RouterWin::Instance().StopRoutingIpv6(); return RouterWin::Instance().StopRoutingIpv6();
#elif defined (Q_OS_MAC) #elif defined (Q_OS_MAC)
// todo fixme return true;// todo fixme
#elif defined Q_OS_LINUX #elif defined Q_OS_LINUX
RouterLinux::Instance().StopRoutingIpv6(); return RouterLinux::Instance().StopRoutingIpv6();
#endif #endif
} }
void Router::StartRoutingIpv6() bool Router::StartRoutingIpv6()
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
RouterWin::Instance().StartRoutingIpv6(); return RouterWin::Instance().StartRoutingIpv6();
#elif defined (Q_OS_MAC) #elif defined (Q_OS_MAC)
// todo fixme return true;// todo fixme
#elif defined Q_OS_LINUX #elif defined Q_OS_LINUX
RouterLinux::Instance().StartRoutingIpv6(); return RouterLinux::Instance().StartRoutingIpv6();
#endif #endif
} }
+3 -3
View File
@@ -19,12 +19,12 @@ public:
static int routeAddList(const QString &gw, const QStringList &ips); static int routeAddList(const QString &gw, const QStringList &ips);
static bool clearSavedRoutes(); static bool clearSavedRoutes();
static int routeDeleteList(const QString &gw, const QStringList &ips); static int routeDeleteList(const QString &gw, const QStringList &ips);
static void flushDns(); static bool flushDns();
static void resetIpStack(); static void resetIpStack();
static bool createTun(const QString &dev, const QString &subnet); static bool createTun(const QString &dev, const QString &subnet);
static bool deleteTun(const QString &dev); static bool deleteTun(const QString &dev);
static void StartRoutingIpv6(); static bool StartRoutingIpv6();
static void StopRoutingIpv6(); static bool StopRoutingIpv6();
static bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers); static bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers);
}; };
+16 -12
View File
@@ -160,7 +160,7 @@ bool RouterLinux::isServiceActive(const QString &serviceName) {
return process.exitCode() == 0; return process.exitCode() == 0;
} }
void RouterLinux::flushDns() bool RouterLinux::flushDns()
{ {
QProcess p; QProcess p;
p.setProcessChannelMode(QProcess::MergedChannels); p.setProcessChannelMode(QProcess::MergedChannels);
@@ -174,7 +174,7 @@ void RouterLinux::flushDns()
p.start("systemctl", { "restart", "systemd-resolved" }); p.start("systemctl", { "restart", "systemd-resolved" });
} else { } else {
qDebug() << "No suitable DNS manager found."; qDebug() << "No suitable DNS manager found.";
return; return false;
} }
p.waitForFinished(); p.waitForFinished();
@@ -183,6 +183,8 @@ void RouterLinux::flushDns()
qDebug().noquote() << "Flush dns completed"; qDebug().noquote() << "Flush dns completed";
else else
qDebug().noquote() << "OUTPUT systemctl restart nscd/systemd-resolved: " + output; qDebug().noquote() << "OUTPUT systemctl restart nscd/systemd-resolved: " + output;
return true;
} }
bool RouterLinux::createTun(const QString &dev, const QString &subnet) { bool RouterLinux::createTun(const QString &dev, const QString &subnet) {
@@ -279,7 +281,7 @@ bool RouterLinux::updateResolvers(const QString& ifname, const QList<QHostAddres
return m_dnsUtil->updateResolvers(ifname, resolvers); return m_dnsUtil->updateResolvers(ifname, resolvers);
} }
void RouterLinux::StartRoutingIpv6() bool RouterLinux::StartRoutingIpv6()
{ {
QProcess process; QProcess process;
QStringList commands; QStringList commands;
@@ -289,12 +291,12 @@ void RouterLinux::StartRoutingIpv6()
if (!process.waitForStarted(1000)) if (!process.waitForStarted(1000))
{ {
qDebug().noquote() << "Could not start activate ipv6\n"; qDebug().noquote() << "Could not start activate ipv6\n";
return; return false;
} }
else if (!process.waitForFinished(2000)) else if (!process.waitForFinished(2000))
{ {
qDebug().noquote() << "Could not activate ipv6\n"; qDebug().noquote() << "Could not activate ipv6\n";
return; return false;
} }
commands.clear(); commands.clear();
@@ -303,19 +305,20 @@ void RouterLinux::StartRoutingIpv6()
if (!process.waitForStarted(1000)) if (!process.waitForStarted(1000))
{ {
qDebug().noquote() << "Could not start activate ipv6\n"; qDebug().noquote() << "Could not start activate ipv6\n";
return; return false;
} }
else if (!process.waitForFinished(2000)) else if (!process.waitForFinished(2000))
{ {
qDebug().noquote() << "Could not activate ipv6\n"; qDebug().noquote() << "Could not activate ipv6\n";
return; return false;
} }
commands.clear(); commands.clear();
qDebug().noquote() << "StartRoutingIpv6 OK"; qDebug().noquote() << "StartRoutingIpv6 OK";
return true;
} }
void RouterLinux::StopRoutingIpv6() bool RouterLinux::StopRoutingIpv6()
{ {
QProcess process; QProcess process;
QStringList commands; QStringList commands;
@@ -325,12 +328,12 @@ void RouterLinux::StopRoutingIpv6()
if (!process.waitForStarted(1000)) if (!process.waitForStarted(1000))
{ {
qDebug().noquote() << "Could not start disable ipv6\n"; qDebug().noquote() << "Could not start disable ipv6\n";
return; return false;
} }
else if (!process.waitForFinished(2000)) else if (!process.waitForFinished(2000))
{ {
qDebug().noquote() << "Could not disable ipv6\n"; qDebug().noquote() << "Could not disable ipv6\n";
return; return false;
} }
commands.clear(); commands.clear();
@@ -339,14 +342,15 @@ void RouterLinux::StopRoutingIpv6()
if (!process.waitForStarted(1000)) if (!process.waitForStarted(1000))
{ {
qDebug().noquote() << "Could not start disable ipv6\n"; qDebug().noquote() << "Could not start disable ipv6\n";
return; return false;
} }
else if (!process.waitForFinished(2000)) else if (!process.waitForFinished(2000))
{ {
qDebug().noquote() << "Could not disable ipv6\n"; qDebug().noquote() << "Could not disable ipv6\n";
return; return false;
} }
commands.clear(); commands.clear();
qDebug().noquote() << "StopRoutingIpv6 OK"; qDebug().noquote() << "StopRoutingIpv6 OK";
return true;
} }
+3 -3
View File
@@ -30,11 +30,11 @@ public:
bool routeDelete(const QString &ip, const QString &gw, const int &sock); bool routeDelete(const QString &ip, const QString &gw, const int &sock);
bool routeDeleteList(const QString &gw, const QStringList &ips); bool routeDeleteList(const QString &gw, const QStringList &ips);
QString getgatewayandiface(); QString getgatewayandiface();
void flushDns(); bool flushDns();
bool createTun(const QString &dev, const QString &subnet); bool createTun(const QString &dev, const QString &subnet);
bool deleteTun(const QString &dev); bool deleteTun(const QString &dev);
void StartRoutingIpv6(); bool StartRoutingIpv6();
void StopRoutingIpv6(); bool StopRoutingIpv6();
bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers); bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers);
public slots: public slots:
+3 -1
View File
@@ -166,7 +166,7 @@ bool RouterMac::deleteTun(const QString &dev)
return true; return true;
} }
void RouterMac::flushDns() bool RouterMac::flushDns()
{ {
// sudo killall -HUP mDNSResponder // sudo killall -HUP mDNSResponder
QProcess p; QProcess p;
@@ -174,5 +174,7 @@ void RouterMac::flushDns()
p.start("killall", QStringList() << "-HUP" << "mDNSResponder"); p.start("killall", QStringList() << "-HUP" << "mDNSResponder");
p.waitForFinished(); p.waitForFinished();
qDebug().noquote() << "OUTPUT killall -HUP mDNSResponder: " + p.readAll(); qDebug().noquote() << "OUTPUT killall -HUP mDNSResponder: " + p.readAll();
return true;
} }
+1 -1
View File
@@ -29,7 +29,7 @@ public:
bool clearSavedRoutes(); bool clearSavedRoutes();
bool routeDelete(const QString &ip, const QString &gw); bool routeDelete(const QString &ip, const QString &gw);
bool routeDeleteList(const QString &gw, const QStringList &ips); bool routeDeleteList(const QString &gw, const QStringList &ips);
void flushDns(); bool flushDns();
bool createTun(const QString &dev, const QString &subnet); bool createTun(const QString &dev, const QString &subnet);
bool deleteTun(const QString &dev); bool deleteTun(const QString &dev);
bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers); bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers);
+6 -3
View File
@@ -273,7 +273,7 @@ int RouterWin::routeDeleteList(const QString &gw, const QStringList &ips)
return success_count; return success_count;
} }
void RouterWin::flushDns() bool RouterWin::flushDns()
{ {
QProcess p; QProcess p;
p.setProcessChannelMode(QProcess::MergedChannels); p.setProcessChannelMode(QProcess::MergedChannels);
@@ -281,6 +281,7 @@ void RouterWin::flushDns()
p.start(command); p.start(command);
p.waitForFinished(); p.waitForFinished();
return true;
//qDebug().noquote() << "OUTPUT ipconfig /flushdns: " + p.readAll(); //qDebug().noquote() << "OUTPUT ipconfig /flushdns: " + p.readAll();
} }
@@ -444,7 +445,7 @@ bool RouterWin::updateResolvers(const QString& ifname, const QList<QHostAddress>
} }
void RouterWin::StopRoutingIpv6() bool RouterWin::StopRoutingIpv6()
{ {
{ {
QProcess p; QProcess p;
@@ -464,9 +465,10 @@ void RouterWin::StopRoutingIpv6()
p.start(command); p.start(command);
p.waitForFinished(); p.waitForFinished();
} }
return true;
} }
void RouterWin::StartRoutingIpv6() bool RouterWin::StartRoutingIpv6()
{ {
{ {
QProcess p; QProcess p;
@@ -486,5 +488,6 @@ void RouterWin::StartRoutingIpv6()
p.start(command); p.start(command);
p.waitForFinished(); p.waitForFinished();
} }
return true;
} }
+3 -3
View File
@@ -39,11 +39,11 @@ public:
int routeAddList(const QString &gw, const QStringList &ips); int routeAddList(const QString &gw, const QStringList &ips);
bool clearSavedRoutes(); bool clearSavedRoutes();
int routeDeleteList(const QString &gw, const QStringList &ips); int routeDeleteList(const QString &gw, const QStringList &ips);
void flushDns(); bool flushDns();
void resetIpStack(); void resetIpStack();
void StartRoutingIpv6(); bool StartRoutingIpv6();
void StopRoutingIpv6(); bool StopRoutingIpv6();
void suspendWcmSvc(bool suspend); void suspendWcmSvc(bool suspend);
bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers); bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers);