@@ -189,7 +189,7 @@ bool KillSwitch::disableAllTraffic() {
189189
190190bool KillSwitch::resetAllowedRange (const QStringList &ranges) {
191191
192- #ifdef Q_OS_LINUX
192+ #if defined( Q_OS_LINUX) || defined(Q_OS_MACOS)
193193 if (!std::all_of (ranges.cbegin (), ranges.cend (), isValidIpOrCidr)) {
194194 qCritical () << " IPC: invalid IP/CIDR in ranges, rejecting resetAllowedRange" ;
195195 return false ;
@@ -220,7 +220,7 @@ bool KillSwitch::resetAllowedRange(const QStringList &ranges) {
220220}
221221
222222bool KillSwitch::addAllowedRange (const QStringList &ranges) {
223- #ifdef Q_OS_LINUX
223+ #if defined( Q_OS_LINUX) || defined(Q_OS_MACOS)
224224 if (!std::all_of (ranges.cbegin (), ranges.cend (), isValidIpOrCidr)) {
225225 qCritical () << " IPC: invalid IP/CIDR in ranges, rejecting addAllowedRange" ;
226226 return false ;
@@ -323,6 +323,15 @@ bool KillSwitch::enableKillSwitch(const QJsonObject &configStr, int vpnAdapterIn
323323 bool allowMarkedXray = 0 ;
324324 QStringList allownets;
325325 QStringList blocknets;
326+ QStringList allowedDnsServers;
327+ for (const QJsonValue &dns : configStr.value (amnezia::configKey::allowedDnsServers).toArray ()) {
328+ if (!dns.isString ()) break ;
329+ const QString dnsStr = dns.toString ();
330+ if (isValidIpOrCidr (dnsStr))
331+ allowedDnsServers.append (dnsStr);
332+ else if (!dnsStr.isEmpty ())
333+ qWarning () << " IPC: rejected invalid allowedDnsServer:" << dnsStr;
334+ }
326335
327336 if (splitTunnelType == 0 ) {
328337 blockAll = true ;
@@ -387,18 +396,7 @@ bool KillSwitch::enableKillSwitch(const QJsonObject &configStr, int vpnAdapterIn
387396
388397 dnsServers.append (" 127.0.0.1" );
389398 dnsServers.append (" 127.0.0.53" );
390-
391-
392- for (auto dns : configStr.value (amnezia::configKey::allowedDnsServers).toArray ()) {
393- if (!dns.isString ()) {
394- break ;
395- }
396- const QString dnsStr = dns.toString ();
397- if (isValidIpOrCidr (dnsStr))
398- dnsServers.append (dnsStr);
399- else if (!dnsStr.isEmpty ())
400- qWarning () << " IPC: rejected invalid allowedDnsServer:" << dnsStr;
401- }
399+ dnsServers.append (allowedDnsServers);
402400
403401 LinuxFirewall::updateDNSServers (dnsServers);
404402 LinuxFirewall::setAnchorEnabled (LinuxFirewall::IPv4, QStringLiteral (" 320.allowDNS" ), true );
@@ -412,6 +410,11 @@ bool KillSwitch::enableKillSwitch(const QJsonObject &configStr, int vpnAdapterIn
412410 MacOSFirewall::install ();
413411
414412 MacOSFirewall::ensureRootAnchorPriority ();
413+ if (!std::all_of (allownets.cbegin (), allownets.cend (), isValidIpOrCidr) ||
414+ !std::all_of (blocknets.cbegin (), blocknets.cend (), isValidIpOrCidr)) {
415+ qCritical () << " IPC: invalid IP/CIDR in allownets/blocknets, rejecting enableKillSwitch" ;
416+ return false ;
417+ }
415418 MacOSFirewall::setAnchorEnabled (QStringLiteral (" 000.allowLoopback" ), true );
416419 MacOSFirewall::setAnchorEnabled (QStringLiteral (" 100.blockAll" ), blockAll);
417420 MacOSFirewall::setAnchorEnabled (QStringLiteral (" 110.allowNets" ), allowNets);
@@ -440,17 +443,8 @@ bool KillSwitch::enableKillSwitch(const QJsonObject &configStr, int vpnAdapterIn
440443 qWarning () << " IPC: rejected invalid dns2:" << dns2;
441444 }
442445
443- for (auto dns : configStr.value (amnezia::configKey::allowedDnsServers).toArray ()) {
444- if (!dns.isString ()) {
445- break ;
446- }
447- const QString dnsStr = dns.toString ();
448- if (isValidIpOrCidr (dnsStr))
449- dnsServers.append (dnsStr);
450- else if (!dnsStr.isEmpty ())
451- qWarning () << " IPC: rejected invalid allowedDnsServer:" << dnsStr;
452- }
453-
446+ dnsServers.append (allowedDnsServers);
447+
454448 MacOSFirewall::setAnchorEnabled (QStringLiteral (" 310.blockDNS" ), true );
455449 MacOSFirewall::setAnchorTable (QStringLiteral (" 310.blockDNS" ), true , QStringLiteral (" dnsaddr" ), dnsServers);
456450 MacOSFirewall::setAnchorEnabled (QStringLiteral (" 400.allowPIA" ), true );
0 commit comments