From 399ce8435d6b16bbbb32c1028176191ea7a4f25f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 24 Feb 2019 16:06:24 +0300 Subject: [PATCH 1/3] Reset tunnel on disconnect --- Sources/OpenVPNAdapter/OpenVPNAdapter.h | 6 +++--- Sources/OpenVPNAdapter/OpenVPNAdapter.mm | 10 ++++++++++ Tests/OpenVPNAdapterTests.swift | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Sources/OpenVPNAdapter/OpenVPNAdapter.h b/Sources/OpenVPNAdapter/OpenVPNAdapter.h index 45b5ccb..3105daa 100644 --- a/Sources/OpenVPNAdapter/OpenVPNAdapter.h +++ b/Sources/OpenVPNAdapter/OpenVPNAdapter.h @@ -34,11 +34,11 @@ typedef NS_ENUM(NSInteger, OpenVPNAdapterEvent); the TUN interface, or nil if an error occurred. @param openVPNAdapter The OpenVPNAdapter instance requesting this information. - @param networkSettings The NEPacketTunnelNetworkSettings to be used for the tunnel. - @param completionHandler The completion handler to be called with a NEPacketTunnelFlow object, or nil if an error occurred. + @param networkSettings The NEPacketTunnelNetworkSettings to be used for the tunnel. Provides nil to clear out the network settings. + @param completionHandler The completion handler to be called with a NEPacketTunnelFlow object, or nil if an error occurred or the network settings were cleared out. */ - (void)openVPNAdapter:(OpenVPNAdapter *)openVPNAdapter -configureTunnelWithNetworkSettings:(NEPacketTunnelNetworkSettings *)networkSettings +configureTunnelWithNetworkSettings:(nullable NEPacketTunnelNetworkSettings *)networkSettings completionHandler:(void (^)(id _Nullable packetFlow))completionHandler NS_SWIFT_NAME(openVPNAdapter(_:configureTunnelWithNetworkSettings:completionHandler:)); diff --git a/Sources/OpenVPNAdapter/OpenVPNAdapter.mm b/Sources/OpenVPNAdapter/OpenVPNAdapter.mm index 0e7a2e1..84a6e29 100644 --- a/Sources/OpenVPNAdapter/OpenVPNAdapter.mm +++ b/Sources/OpenVPNAdapter/OpenVPNAdapter.mm @@ -398,6 +398,16 @@ _sessionName = nil; _packetFlowBridge = nil; _networkSettingsBuilder = nil; + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + void (^completionHandler)(id _Nullable) = ^(id flow) { + dispatch_semaphore_signal(semaphore); + }; + + [self.delegate openVPNAdapter:self configureTunnelWithNetworkSettings:nil completionHandler:completionHandler]; + + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC)); } #pragma mark - diff --git a/Tests/OpenVPNAdapterTests.swift b/Tests/OpenVPNAdapterTests.swift index eb3a29d..11b7ec0 100644 --- a/Tests/OpenVPNAdapterTests.swift +++ b/Tests/OpenVPNAdapterTests.swift @@ -111,7 +111,7 @@ class OpenVPNAdapterTests: XCTestCase { extension OpenVPNAdapterTests: OpenVPNAdapterDelegate { - func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings, completionHandler: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { + func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, completionHandler: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { completionHandler(customFlow) } From 4889f3b8cd819c8f2576119f0d2e2405c96f5d4c Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 24 Feb 2019 16:08:24 +0300 Subject: [PATCH 2/3] Delete tunPersist property because tun builder doesn't use this option --- Sources/OpenVPNAdapter/OpenVPNConfiguration.h | 5 ----- Sources/OpenVPNAdapter/OpenVPNConfiguration.mm | 8 -------- 2 files changed, 13 deletions(-) diff --git a/Sources/OpenVPNAdapter/OpenVPNConfiguration.h b/Sources/OpenVPNAdapter/OpenVPNConfiguration.h index 4276997..f0a324a 100644 --- a/Sources/OpenVPNAdapter/OpenVPNConfiguration.h +++ b/Sources/OpenVPNAdapter/OpenVPNConfiguration.h @@ -64,11 +64,6 @@ typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile); */ @property (nonatomic) NSInteger connectionTimeout; -/** - Keep tun interface active during pauses or reconnections - */ -@property (nonatomic) BOOL tunPersist; - /** If YES and a redirect-gateway profile doesn't also define DNS servers, use the standard Google DNS servers. diff --git a/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm b/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm index 42565d1..d93ce8b 100644 --- a/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm +++ b/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm @@ -308,14 +308,6 @@ NSString *const OpenVPNTLSCertProfileDefaultValue = @"default"; _config.connTimeout = connectionTimeout; } -- (BOOL)tunPersist { - return _config.tunPersist; -} - -- (void)setTunPersist:(BOOL)tunPersist { - _config.tunPersist = tunPersist; -} - - (BOOL)googleDNSFallback { return _config.googleDnsFallback; } From 9b51c260a1357ab30b702228af748d8c2c18b0fe Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 24 Feb 2019 16:10:45 +0300 Subject: [PATCH 3/3] Clear out tunPersist mentions --- Sources/OpenVPNAdapter/OpenVPNConfiguration.mm | 3 --- 1 file changed, 3 deletions(-) diff --git a/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm b/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm index d93ce8b..bb8d414 100644 --- a/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm +++ b/Sources/OpenVPNAdapter/OpenVPNConfiguration.mm @@ -477,7 +477,6 @@ NSString *const OpenVPNTLSCertProfileDefaultValue = @"default"; configuration.proto = self.proto; configuration.ipv6 = self.ipv6; configuration.connectionTimeout = self.connectionTimeout; - configuration.tunPersist = self.tunPersist; configuration.googleDNSFallback = self.googleDNSFallback; configuration.synchronousDNSLookup = self.synchronousDNSLookup; configuration.autologinSessions = self.autologinSessions; @@ -504,7 +503,6 @@ NSString *const OpenVPNTLSCertProfileDefaultValue = @"default"; [aCoder encodeInteger:self.proto forKey:NSStringFromSelector(@selector(proto))]; [aCoder encodeInteger:self.ipv6 forKey:NSStringFromSelector(@selector(ipv6))]; [aCoder encodeInteger:self.connectionTimeout forKey:NSStringFromSelector(@selector(connectionTimeout))]; - [aCoder encodeBool:self.tunPersist forKey:NSStringFromSelector(@selector(tunPersist))]; [aCoder encodeBool:self.googleDNSFallback forKey:NSStringFromSelector(@selector(googleDNSFallback))]; [aCoder encodeBool:self.synchronousDNSLookup forKey:NSStringFromSelector(@selector(synchronousDNSLookup))]; [aCoder encodeBool:self.autologinSessions forKey:NSStringFromSelector(@selector(autologinSessions))]; @@ -531,7 +529,6 @@ NSString *const OpenVPNTLSCertProfileDefaultValue = @"default"; self.proto = (OpenVPNTransportProtocol)[aDecoder decodeIntegerForKey:NSStringFromSelector(@selector(proto))]; self.ipv6 = (OpenVPNIPv6Preference)[aDecoder decodeIntegerForKey:NSStringFromSelector(@selector(ipv6))]; self.connectionTimeout = [aDecoder decodeIntegerForKey:NSStringFromSelector(@selector(connectionTimeout))]; - self.tunPersist = [aDecoder decodeBoolForKey:NSStringFromSelector(@selector(tunPersist))]; self.googleDNSFallback = [aDecoder decodeBoolForKey:NSStringFromSelector(@selector(googleDNSFallback))]; self.synchronousDNSLookup = [aDecoder decodeBoolForKey:NSStringFromSelector(@selector(synchronousDNSLookup))]; self.autologinSessions = [aDecoder decodeBoolForKey:NSStringFromSelector(@selector(autologinSessions))];