diff --git a/vpn/client/darwin/DapUtun.cpp b/vpn/client/darwin/DapUtun.cpp index 23370a8de7527efcf1de94861305630dfaf1d773..559473d2093525e51d54e1fe2607b1ff799b8a25 100644 --- a/vpn/client/darwin/DapUtun.cpp +++ b/vpn/client/darwin/DapUtun.cpp @@ -161,9 +161,7 @@ QString DapUtun::getInternetInterface() { return DapUtils::shellCmd("route get 8.8.8.8 | grep interface | awk '{print $2;}'"); } - -void DapUtun::saveCurrentConnectionInterfaceData() -{ +void DapUtun::saveCurrentConnectionInterfaceData() { m_lastUsedConnectionDevice = getInternetInterface(); qDebug() << "Current internet interface:" << m_lastUsedConnectionDevice; @@ -238,11 +236,19 @@ QString DapUtun::getDNSServers(const QString &service) { return process.readAllStandardOutput().trimmed(); } -bool DapUtun::clearDNSServers(const QString &service) { +bool DapUtun::setDNS(const QString &service, const QString &dnsServer) { QProcess process; - process.start("networksetup", QStringList() << "-setdnsservers" << service << "empty"); + QStringList arguments; + + if (dnsServer.isEmpty()) { + arguments << "-setdnsservers" << service << "empty"; + } else { + arguments << "-setdnsservers" << service << dnsServer; + } + + process.start("networksetup", arguments); if (!process.waitForFinished(5000)) { - qWarning() << "Timeout while clearing DNS for service" << service << ":" << process.errorString(); + qWarning() << "Timeout while configuring DNS for service" << service << ":" << process.errorString(); return false; } @@ -255,34 +261,28 @@ bool DapUtun::clearDNSServers(const QString &service) { return true; } -void DapUtun::clearAllDNS() { +//Not used because breaks other interfaces. At the moment, only the utun interface is being modified. +void DapUtun::configureDNS(const QMap<QString, QString> &dnsMap) { QStringList services = getNetworkServices(); if (services.isEmpty()) { - qWarning() << "No network services to clear DNS."; + qWarning() << "No network services detected."; return; } for (const QString &service : services) { - QString dns = getDNSServers(service); - - if (dns.isEmpty() || dns.contains("There aren't any DNS Servers set on")) { - qDebug() << "DNS servers already cleared for service:" << service; - continue; + QString dnsServer = dnsMap.value(service, ""); + if (setDNS(service, dnsServer)) { + qDebug() << "DNS servers successfully " << (dnsServer.isEmpty() ? "cleared" : "configured") << " for service:" << service; } else { - qWarning() << "Existing DNS servers for" << service << ":" << dns; - } - - if (clearDNSServers(service)) { - dns = getDNSServers(service); - if (dns.isEmpty() || dns.contains("There aren't any DNS Servers set on")) { - qDebug() << "DNS servers successfully cleared for service:" << service; - } else { - qWarning() << "DNS servers still present after clearance for service" << service << ":" << dns; - } + qWarning() << "Failed to " << (dnsServer.isEmpty() ? "clear" : "configure") << " DNS servers for service:" << service; } } } +void DapUtun::clearAllDNS() { + configureDNS(QMap<QString, QString>()); +} + void DapUtun::onWorkerStarted() { qDebug() << "Starting tunnel creation"; @@ -293,7 +293,6 @@ void DapUtun::onWorkerStarted() } saveCurrentConnectionInterfaceData(); - clearAllDNS(); m_currentInterface = getCurrentNetworkInterface(); if (m_currentInterface.isEmpty()) { diff --git a/vpn/client/darwin/DapUtun.h b/vpn/client/darwin/DapUtun.h index e20bac7c38c294b06c57b2a2b6727c0262154079..1659a4fc29422515060a3f16d2d9875b4af0cfe9 100644 --- a/vpn/client/darwin/DapUtun.h +++ b/vpn/client/darwin/DapUtun.h @@ -55,6 +55,7 @@ protected: void tunDeviceDestroy(); void onWorkerStarted(); void clearAllDNS(); + void configureDNS(const QMap<QString, QString> &dnsMap); QString getCurrentNetworkInterface(); @@ -66,7 +67,7 @@ private: QStringList getNetworkServices(); QString getDNSServers(const QString &service); - bool clearDNSServers(const QString &service); + bool setDNS(const QString &service, const QString &dnsServer); // Connection witch used before creating utun Interface QString m_lastUsedConnectionName; @@ -81,4 +82,6 @@ private: // Get current active internet interface QString getInternetInterface(); + QMap<QString, QString> m_dnsMap; + };