From 26825c28988a4a08a1c104757401c7e9345bfd66 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 30 Apr 2024 15:13:17 +0300 Subject: [PATCH] Update Mozilla upstream for MacOS --- client/platforms/ios/iosnetworkwatcher.h | 1 - client/platforms/ios/iosnetworkwatcher.mm | 10 ------- .../macos/daemon/macosroutemonitor.cpp | 10 +++++++ client/platforms/macos/macospingsender.cpp | 6 ++-- client/platforms/macos/macosutils.mm | 30 ++++++++++++++++--- 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/client/platforms/ios/iosnetworkwatcher.h b/client/platforms/ios/iosnetworkwatcher.h index 5b779a879..70609e1f9 100644 --- a/client/platforms/ios/iosnetworkwatcher.h +++ b/client/platforms/ios/iosnetworkwatcher.h @@ -15,7 +15,6 @@ class IOSNetworkWatcher : public NetworkWatcherImpl { ~IOSNetworkWatcher(); void initialize() override; - NetworkWatcherImpl::TransportType getTransportType() override; private: NetworkWatcherImpl::TransportType toTransportType(nw_path_t path); diff --git a/client/platforms/ios/iosnetworkwatcher.mm b/client/platforms/ios/iosnetworkwatcher.mm index 9c6ca4114..720b303b2 100644 --- a/client/platforms/ios/iosnetworkwatcher.mm +++ b/client/platforms/ios/iosnetworkwatcher.mm @@ -37,16 +37,6 @@ void IOSNetworkWatcher::initialize() { //TODO IMPL FOR AMNEZIA } -NetworkWatcherImpl::TransportType IOSNetworkWatcher::getTransportType() { - //TODO IMPL FOR AMNEZIA - - if (m_observableConnection != nil) { - return m_currentVPNTransport; - } - // If we don't have an open tunnel-observer, m_currentVPNTransport is probably wrong. - return NetworkWatcherImpl::TransportType_Unknown; -} - NetworkWatcherImpl::TransportType IOSNetworkWatcher::toTransportType(nw_path_t path) { if (path == nil) { return NetworkWatcherImpl::TransportType_Unknown; diff --git a/client/platforms/macos/daemon/macosroutemonitor.cpp b/client/platforms/macos/daemon/macosroutemonitor.cpp index 9f1da4eca..395f008af 100644 --- a/client/platforms/macos/daemon/macosroutemonitor.cpp +++ b/client/platforms/macos/daemon/macosroutemonitor.cpp @@ -95,6 +95,11 @@ void MacosRouteMonitor::handleRtmDelete(const struct rt_msghdr* rtm, !(rtm->rtm_addrs & RTA_NETMASK) || (addrlist.count() < 3)) { return; } + // Ignore interface-scoped routes, we want to find the default route to the + // internet in the global scope. + if (rtm->rtm_flags & RTF_IFSCOPE) { + return; + } // Check for a default route, which should have a netmask of zero. const struct sockaddr* sa = @@ -156,6 +161,11 @@ void MacosRouteMonitor::handleRtmUpdate(const struct rt_msghdr* rtm, !(rtm->rtm_addrs & RTA_NETMASK) || (addrlist.count() < 3)) { return; } + // Ignore interface-scoped routes, we want to find the default route to the + // internet in the global scope. + if (rtm->rtm_flags & RTF_IFSCOPE) { + return; + } // Ignore route changes that we caused, or routes on the tunnel interface. if (rtm->rtm_index == m_ifindex) { return; diff --git a/client/platforms/macos/macospingsender.cpp b/client/platforms/macos/macospingsender.cpp index 3b5a09b08..8f1082594 100644 --- a/client/platforms/macos/macospingsender.cpp +++ b/client/platforms/macos/macospingsender.cpp @@ -83,7 +83,7 @@ void MacOSPingSender::sendPing(const QHostAddress& dest, quint16 sequence) { packet.icmp_seq = htons(sequence); packet.icmp_cksum = inetChecksum(&packet, sizeof(packet)); - if (sendto(m_socket, (char*)&packet, sizeof(packet), 0, + if (sendto(m_socket, (char*)&packet, sizeof(packet), MSG_NOSIGNAL, (struct sockaddr*)&addr, sizeof(addr)) != sizeof(packet)) { logger.error() << "ping sending failed:" << strerror(errno); emit criticalPingError(); @@ -107,9 +107,9 @@ void MacOSPingSender::socketReady() { iov.iov_base = packet; iov.iov_len = IP_MAXPACKET; - ssize_t rc = recvmsg(m_socket, &msg, MSG_DONTWAIT); + ssize_t rc = recvmsg(m_socket, &msg, MSG_DONTWAIT | MSG_NOSIGNAL); if (rc <= 0) { - logger.error() << "Recvmsg failed"; + logger.error() << "Recvmsg failed:" << strerror(errno); return; } diff --git a/client/platforms/macos/macosutils.mm b/client/platforms/macos/macosutils.mm index cbe30583b..1842adaa3 100644 --- a/client/platforms/macos/macosutils.mm +++ b/client/platforms/macos/macosutils.mm @@ -41,11 +41,33 @@ void MacOSUtils::enableLoginItem(bool startAtBoot) { Q_ASSERT(appId); NSString* loginItemAppId = - QString("%1.login-item").arg(QString::fromNSString(appId)).toNSString(); - CFStringRef cfs = (__bridge CFStringRef)loginItemAppId; + QString("%1.login-item").arg(QString::fromNSString(appId)).toNSString(); - Boolean ok = SMLoginItemSetEnabled(cfs, startAtBoot ? YES : NO); - logger.debug() << "Result: " << ok; + // For macOS 13 and beyond, register() and unregister() methods + // are used for managing login items since SMLoginItemSetEnabled() is deprecated. + // For versions prior to macOS 13, SMLoginItemSetEnabled() is used. + if (@available(macOS 13, *)) { + // Use register() or unregister() based on the startAtBoot flag + NSError* error = nil; + + if (startAtBoot) { + if (![[SMAppService mainAppService] registerAndReturnError: & error]) { + logger.error() << "Failed to register Mozilla VPN LoginItem: " << error.localizedDescription; + } else { + logger.debug() << "Mozilla VPN LoginItem registered successfully."; + } + } else { + if (![[SMAppService mainAppService] unregisterAndReturnError: & error]) { + logger.error() << "Failed to unregister Mozilla VPN LoginItem: " << error.localizedDescription; + } else { + logger.debug() << "LoginItem unregistered successfully."; + } + } + } else { + CFStringRef cfs = (__bridge CFStringRef) loginItemAppId; + Boolean ok = SMLoginItemSetEnabled(cfs, startAtBoot ? YES : NO); + logger.debug() << "Result: " << ok; + } } namespace {