diff options
| author | Emīls <emils@mullvad.net> | 2023-05-29 16:45:59 +0200 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2023-05-29 16:45:59 +0200 |
| commit | fb49b1e742f28bc526f96f1e1b281be37a4b876e (patch) | |
| tree | 45cbf6d694450ea95d02f1be8ea370f19133cba3 | |
| parent | 1205787ca4182977272be73bc9ee49f1bf8db06d (diff) | |
| parent | fc7b61857e888d14f39e5361e1f287aa039ce19b (diff) | |
| download | mullvadvpn-fb49b1e742f28bc526f96f1e1b281be37a4b876e.tar.xz mullvadvpn-fb49b1e742f28bc526f96f1e1b281be37a4b876e.zip | |
Merge branch 'introduce-mullvadtransport-ios-181'
32 files changed, 572 insertions, 195 deletions
diff --git a/Cargo.toml b/Cargo.toml index a496374515..246e2a1e02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ resolver = "2" members = [ "android/translations-converter", - "ios/MullvadREST/shadowsocks-proxy", + "ios/MullvadTransport/shadowsocks-proxy", "mullvad-daemon", "mullvad-cli", "mullvad-fs", diff --git a/ios/MullvadREST/RESTNetworkOperation.swift b/ios/MullvadREST/RESTNetworkOperation.swift index aaecaabe4e..41072de713 100644 --- a/ios/MullvadREST/RESTNetworkOperation.swift +++ b/ios/MullvadREST/RESTNetworkOperation.swift @@ -143,8 +143,8 @@ extension REST { let suggestedTransport = transportStrategy.connectionTransport() let transportProvider = transportProvider() - let transport = suggestedTransport == .useShadowSocks - ? transportProvider?.shadowSocksTransport() + let transport = suggestedTransport == .useShadowsocks + ? transportProvider?.shadowsocksTransport() : transportProvider?.transport() guard let transport else { diff --git a/ios/MullvadREST/RESTTransport.swift b/ios/MullvadREST/RESTTransport.swift index b739828bf2..8b6854c486 100644 --- a/ios/MullvadREST/RESTTransport.swift +++ b/ios/MullvadREST/RESTTransport.swift @@ -11,7 +11,6 @@ import MullvadTypes public protocol RESTTransport { var name: String { get } - func sendRequest( _ request: URLRequest, completion: @escaping (Data?, URLResponse?, Error?) -> Void @@ -25,5 +24,5 @@ public protocol RESTTransportProvider { /// Requests a Shadowsocks transport /// - Returns: A transport layer that proxies the requests to a local Shadowsocks proxy instance - func shadowSocksTransport() -> RESTTransport? + func shadowsocksTransport() -> RESTTransport? } diff --git a/ios/MullvadREST/RESTTransportStrategy.swift b/ios/MullvadREST/RESTTransportStrategy.swift index 5162100a64..c04384a552 100644 --- a/ios/MullvadREST/RESTTransportStrategy.swift +++ b/ios/MullvadREST/RESTTransportStrategy.swift @@ -8,40 +8,38 @@ import Foundation -extension REST { - public struct TransportStrategy: Codable { - /// The different transports suggested by the strategy - public enum Transport { - /// Suggests using a direct connection - case useURLSession - /// Suggests connecting via Shadowsocks proxy - case useShadowSocks - } +public struct TransportStrategy: Codable { + /// The different transports suggested by the strategy + public enum Transport { + /// Suggests using a direct connection + case useURLSession + /// Suggests connecting via Shadowsocks proxy + case useShadowsocks + } - /// The internal counter for suggested transports. - /// - /// A value of `0` means a direct transport suggestion, a value of `1` or `2` means a Shadowsocks transport - /// suggestion. - private var connectionAttempts: UInt + /// The internal counter for suggested transports. + /// + /// A value of `0` means a direct transport suggestion, a value of `1` or `2` means a Shadowsocks transport + /// suggestion. + private var connectionAttempts: UInt - public init() { - connectionAttempts = 0 - } + public init() { + connectionAttempts = 0 + } - /// Instructs the strategy that a network connection failed - /// - /// Every third failure results in a direct transport suggestion. - public mutating func didFail() { - connectionAttempts += 1 - // Avoid overflowing by resetting back to 0 every 3rd failure - connectionAttempts = connectionAttempts.isMultiple(of: 3) ? 0 : connectionAttempts - } + /// Instructs the strategy that a network connection failed + /// + /// Every third failure results in a direct transport suggestion. + public mutating func didFail() { + connectionAttempts += 1 + // Avoid overflowing by resetting back to 0 every 3rd failure + connectionAttempts = connectionAttempts.isMultiple(of: 3) ? 0 : connectionAttempts + } - /// The suggested connection transport - /// - /// - Returns: `.useURLSession` for every 3rd failed attempt, `.useShadowSocks` otherwise - public func connectionTransport() -> Transport { - connectionAttempts.isMultiple(of: 3) ? .useURLSession : .useShadowSocks - } + /// The suggested connection transport + /// + /// - Returns: `.useURLSession` for every 3rd failed attempt, `.useShadowsocks` otherwise + public func connectionTransport() -> Transport { + connectionAttempts.isMultiple(of: 3) ? .useURLSession : .useShadowsocks } } diff --git a/ios/MullvadRESTTests/TransportStrategyTests.swift b/ios/MullvadRESTTests/TransportStrategyTests.swift index 75ed74279d..31eb449d2f 100644 --- a/ios/MullvadRESTTests/TransportStrategyTests.swift +++ b/ios/MullvadRESTTests/TransportStrategyTests.swift @@ -11,27 +11,27 @@ import XCTest final class TransportStrategyTests: XCTestCase { func testEveryThirdConnectionAttemptsIsDirect() { - var strategy = REST.TransportStrategy() + var strategy = TransportStrategy() for index in 0 ... 12 { - let expectedResult: REST.TransportStrategy.Transport - expectedResult = index.isMultiple(of: 3) ? .useURLSession : .useShadowSocks + let expectedResult: TransportStrategy.Transport + expectedResult = index.isMultiple(of: 3) ? .useURLSession : .useShadowsocks XCTAssertEqual(strategy.connectionTransport(), expectedResult) strategy.didFail() } } func testLoadingFromCacheDoesNotImpactStrategy() throws { - var strategy = REST.TransportStrategy() + var strategy = TransportStrategy() // Fail twice, the next suggested transport mode should be via Shadowsocks proxy strategy.didFail() strategy.didFail() - XCTAssertEqual(strategy.connectionTransport(), .useShadowSocks) + XCTAssertEqual(strategy.connectionTransport(), .useShadowsocks) // Serialize the strategy and reload it from memory to simulate an application restart let encodedRawStrategy = try JSONEncoder().encode(strategy) - var reloadedStrategy = try JSONDecoder().decode(REST.TransportStrategy.self, from: encodedRawStrategy) + var reloadedStrategy = try JSONDecoder().decode(TransportStrategy.self, from: encodedRawStrategy) // This should be the third failure, the next suggested transport will be a direct one reloadedStrategy.didFail() diff --git a/ios/MullvadTransport/Info.plist b/ios/MullvadTransport/Info.plist new file mode 100644 index 0000000000..0c67376eba --- /dev/null +++ b/ios/MullvadTransport/Info.plist @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict/> +</plist> diff --git a/ios/MullvadTransport/MullvadTransport.h b/ios/MullvadTransport/MullvadTransport.h new file mode 100644 index 0000000000..cd1e9b50a0 --- /dev/null +++ b/ios/MullvadTransport/MullvadTransport.h @@ -0,0 +1,19 @@ +// +// MullvadTransport.h +// MullvadTransport +// +// Created by Marco Nikic on 2023-05-25. +// Copyright © 2023 Mullvad VPN AB. All rights reserved. +// + +#import <Foundation/Foundation.h> + +//! Project version number for MullvadTransport. +FOUNDATION_EXPORT double MullvadTransportVersionNumber; + +//! Project version string for MullvadTransport. +FOUNDATION_EXPORT const unsigned char MullvadTransportVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import <MullvadTransport/PublicHeader.h> + + diff --git a/ios/MullvadREST/ShadowSocksProxy.swift b/ios/MullvadTransport/ShadowSocksProxy.swift index 8c54a101ee..afcc32c428 100644 --- a/ios/MullvadREST/ShadowSocksProxy.swift +++ b/ios/MullvadTransport/ShadowSocksProxy.swift @@ -1,5 +1,5 @@ // -// ShadowSocksProxy.swift +// ShadowsocksProxy.swift // MullvadREST // // Created by Emils on 19/04/2023. diff --git a/ios/MullvadTransport/TransportProvider.swift b/ios/MullvadTransport/TransportProvider.swift new file mode 100644 index 0000000000..821ea3d059 --- /dev/null +++ b/ios/MullvadTransport/TransportProvider.swift @@ -0,0 +1,59 @@ +// +// TransportProvider.swift +// MullvadTransport +// +// Created by Marco Nikic on 2023-05-25. +// Copyright © 2023 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import Logging +import MullvadREST +import MullvadTypes +import RelayCache +import RelaySelector + +public final class TransportProvider: RESTTransportProvider { + private let urlSessionTransport: URLSessionTransport + private let relayCache: RelayCache + private let logger = Logger(label: "TransportProvider") + private let addressCache: REST.AddressCache + + public init(urlSessionTransport: URLSessionTransport, relayCache: RelayCache, addressCache: REST.AddressCache) { + self.urlSessionTransport = urlSessionTransport + self.relayCache = relayCache + self.addressCache = addressCache + } + + public func transport() -> RESTTransport? { + urlSessionTransport + } + + public func shadowsocksTransport() -> RESTTransport? { + do { + let cachedRelays = try relayCache.read() + let shadowsocksConfiguration = RelaySelector.getShadowsocksTCPBridge(relays: cachedRelays.relays) + let shadowsocksBridgeRelay = RelaySelector.getShadowsocksRelay(relays: cachedRelays.relays) + + guard let shadowsocksConfiguration, + let shadowsocksBridgeRelay + else { + logger.error("Could not get shadow socks bridge information.") + return nil + } + + let shadowsocksURLSession = urlSessionTransport.urlSession + let shadowsocksTransport = URLSessionShadowsocksTransport( + urlSession: shadowsocksURLSession, + shadowsocksConfiguration: shadowsocksConfiguration, + shadowsocksBridgeRelay: shadowsocksBridgeRelay, + addressCache: addressCache + ) + + return shadowsocksTransport + } catch { + logger.error(error: error) + } + return nil + } +} diff --git a/ios/MullvadTransport/URLSessionTransport.swift b/ios/MullvadTransport/URLSessionTransport.swift new file mode 100644 index 0000000000..49bc131895 --- /dev/null +++ b/ios/MullvadTransport/URLSessionTransport.swift @@ -0,0 +1,87 @@ +// +// URLSessionTransport.swift +// MullvadREST +// +// Created by Sajad Vishkai on 2022-10-03. +// Copyright © 2022 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import MullvadREST +import MullvadTypes + +extension URLSessionTask: Cancellable {} + +public final class URLSessionTransport: RESTTransport { + public var name: String { + return "url-session" + } + + public let urlSession: URLSession + public init(urlSession: URLSession) { + self.urlSession = urlSession + } + + public func sendRequest( + _ request: URLRequest, + completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void + ) -> Cancellable { + let dataTask = urlSession.dataTask(with: request, completionHandler: completion) + dataTask.resume() + return dataTask + } +} + +public final class URLSessionShadowsocksTransport: RESTTransport { + /// The Shadowsocks proxy instance that proxies all the traffic it receives + private let shadowsocksProxy: ShadowsocksProxy + /// The IPv4 representation of the loopback address used by `shadowsocksProxy` + private let localhost = "127.0.0.1" + + /// The `URLSession` used to send requests via `shadowsocksProxy` + public let urlSession: URLSession + + public var name: String { + return "shadow-socks-url-session" + } + + public init( + urlSession: URLSession, + shadowsocksConfiguration: REST.ServerShadowsocks, + shadowsocksBridgeRelay: REST.BridgeRelay, + addressCache: REST.AddressCache + ) { + self.urlSession = urlSession + let apiAddress = addressCache.getCurrentEndpoint() + + shadowsocksProxy = ShadowsocksProxy( + forwardAddress: apiAddress.ip, + forwardPort: apiAddress.port, + bridgeAddress: shadowsocksBridgeRelay.ipv4AddrIn, + bridgePort: shadowsocksConfiguration.port, + password: shadowsocksConfiguration.password, + cipher: shadowsocksConfiguration.cipher + ) + } + + public func sendRequest( + _ request: URLRequest, + completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void + ) -> Cancellable { + // Start the Shadowsocks proxy in order to get a local port + shadowsocksProxy.start() + + // Copy the URL request and rewrite the host and port to point to the Shadowsocks proxy instance + var urlRequestCopy = request + urlRequestCopy.url = request.url.flatMap { url in + var components = URLComponents(url: url, resolvingAgainstBaseURL: false) + components?.host = localhost + components?.port = Int(shadowsocksProxy.localPort()) + return components?.url + } + + let dataTask = urlSession.dataTask(with: urlRequestCopy, completionHandler: completion) + dataTask.resume() + return dataTask + } +} diff --git a/ios/MullvadREST/module.private.modulemap b/ios/MullvadTransport/module.private.modulemap index ed8bb99f2e..ed8bb99f2e 100644 --- a/ios/MullvadREST/module.private.modulemap +++ b/ios/MullvadTransport/module.private.modulemap diff --git a/ios/MullvadREST/shadowsocks-proxy/.gitignore b/ios/MullvadTransport/shadowsocks-proxy/.gitignore index 2f7896d1d1..2f7896d1d1 100644 --- a/ios/MullvadREST/shadowsocks-proxy/.gitignore +++ b/ios/MullvadTransport/shadowsocks-proxy/.gitignore diff --git a/ios/MullvadREST/shadowsocks-proxy/Cargo.toml b/ios/MullvadTransport/shadowsocks-proxy/Cargo.toml index 48f2c92539..48f2c92539 100644 --- a/ios/MullvadREST/shadowsocks-proxy/Cargo.toml +++ b/ios/MullvadTransport/shadowsocks-proxy/Cargo.toml diff --git a/ios/MullvadREST/shadowsocks-proxy/build.rs b/ios/MullvadTransport/shadowsocks-proxy/build.rs index 7154b2d785..7154b2d785 100644 --- a/ios/MullvadREST/shadowsocks-proxy/build.rs +++ b/ios/MullvadTransport/shadowsocks-proxy/build.rs diff --git a/ios/MullvadREST/shadowsocks-proxy/build.sh b/ios/MullvadTransport/shadowsocks-proxy/build.sh index 7617bc91c8..7617bc91c8 100644 --- a/ios/MullvadREST/shadowsocks-proxy/build.sh +++ b/ios/MullvadTransport/shadowsocks-proxy/build.sh diff --git a/ios/MullvadREST/shadowsocks-proxy/include/shadowsocks.h b/ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h index 1a0a856d8d..1a0a856d8d 100644 --- a/ios/MullvadREST/shadowsocks-proxy/include/shadowsocks.h +++ b/ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h diff --git a/ios/MullvadREST/shadowsocks-proxy/src/bin/run.rs b/ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs index 1b096a5335..1b096a5335 100644 --- a/ios/MullvadREST/shadowsocks-proxy/src/bin/run.rs +++ b/ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs diff --git a/ios/MullvadREST/shadowsocks-proxy/src/bin/run_unsafe.rs b/ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs index 805d1147a4..805d1147a4 100644 --- a/ios/MullvadREST/shadowsocks-proxy/src/bin/run_unsafe.rs +++ b/ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs diff --git a/ios/MullvadREST/shadowsocks-proxy/src/ffi.rs b/ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs index fc083f18bf..fc083f18bf 100644 --- a/ios/MullvadREST/shadowsocks-proxy/src/ffi.rs +++ b/ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs diff --git a/ios/MullvadREST/shadowsocks-proxy/src/lib.rs b/ios/MullvadTransport/shadowsocks-proxy/src/lib.rs index 3388280782..3388280782 100644 --- a/ios/MullvadREST/shadowsocks-proxy/src/lib.rs +++ b/ios/MullvadTransport/shadowsocks-proxy/src/lib.rs diff --git a/ios/MullvadTransport/shadowsocks.h b/ios/MullvadTransport/shadowsocks.h new file mode 100644 index 0000000000..487199ecc5 --- /dev/null +++ b/ios/MullvadTransport/shadowsocks.h @@ -0,0 +1,33 @@ +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> + +typedef struct ProxyHandle { + void *context; + uint16_t port; +} ProxyHandle; + +/** + * # Safety + * `addr`, `password`, `cipher` must be valid for the lifetime of this function call and they must + * be backed by the amount of bytes as stored in the respective `*_len` parameters. + * + * `proxy_config` must be pointing to a valid memory region for the size of a `ProxyHandle` + * instance. + */ +int32_t start_shadowsocks_proxy(const uint8_t *addr, + uintptr_t addr_len, + uint16_t port, + const uint8_t *password, + uintptr_t password_len, + const uint8_t *cipher, + uintptr_t cipher_len, + struct ProxyHandle *proxy_config); + +/** + * # Safety + * `proxy_config` must be pointing to a valid instance of a `ProxyInstance`, as instantiated by + * `start_shadowsocks_proxy`. + */ +int32_t stop_shadowsocks_proxy(struct ProxyHandle *proxy_config); diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index b700a6199f..3d83d27de7 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 01F1FF1C29F06124007083C3 /* ShadowsocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */; }; 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */; }; 062B45A328FD4CA700746E77 /* le_root_cert.cer in Resources */ = {isa = PBXBuildFile; fileRef = 06799AB428F98CE700ACD94E /* le_root_cert.cer */; }; 062B45AE28FD503000746E77 /* WireGuardKit in Frameworks */ = {isa = PBXBuildFile; productRef = 062B45AD28FD503000746E77 /* WireGuardKit */; }; @@ -32,7 +31,6 @@ 06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 06799ADA28F98E4800ACD94E /* RESTResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66628F83CA30033DD93 /* RESTResponseHandler.swift */; }; 06799ADB28F98E4800ACD94E /* RESTProxyFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66728F83CA30033DD93 /* RESTProxyFactory.swift */; }; - 06799ADC28F98E4800ACD94E /* RESTTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */; }; 06799ADD28F98E4800ACD94E /* RESTError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66928F83CA30033DD93 /* RESTError.swift */; }; 06799ADE28F98E4800ACD94E /* RESTRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */; }; 06799ADF28F98E4800ACD94E /* RESTDevicesProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */; }; @@ -46,7 +44,6 @@ 06799AE728F98E4800ACD94E /* RESTURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */; }; 06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */; }; 06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */; }; - 06799AEE28F98E4800ACD94E /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */; }; 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */; }; 06799AF028F98E4800ACD94E /* REST.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67B28F83CA50033DD93 /* REST.swift */; }; 06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */; }; @@ -136,7 +133,6 @@ 586A950E290125F3007BAF2B /* ProductsRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846226426E0D9630035F7C2 /* ProductsRequestOperation.swift */; }; 586A950F29012BEE007BAF2B /* AddressCacheTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114028F841390037AF9A /* AddressCacheTracker.swift */; }; 586E54FB27A2DF6D0029B88B /* SendTunnelProviderMessageOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586E54FA27A2DF6D0029B88B /* SendTunnelProviderMessageOperation.swift */; }; - 586F2BE229F6916F009E6924 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 586F2BE129F6916F009E6924 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5871167F2910035700D41AAC /* PreferencesInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5871167E2910035700D41AAC /* PreferencesInteractor.swift */; }; 5871FB96254ADE4E0051A0A4 /* ConsolidatedApplicationLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5871FB95254ADE4E0051A0A4 /* ConsolidatedApplicationLog.swift */; }; 5871FBA0254C26C00051A0A4 /* NSRegularExpression+IPAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5871FB9F254C26BF0051A0A4 /* NSRegularExpression+IPAddress.swift */; }; @@ -371,10 +367,21 @@ 7AF0419E29E957EB00D492DD /* AccountCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF0419D29E957EB00D492DD /* AccountCoordinator.swift */; }; A917351F29FAA9C400D5DCFD /* RESTTransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A917351E29FAA9C400D5DCFD /* RESTTransportStrategy.swift */; }; A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A917352029FAAA5200D5DCFD /* TransportStrategyTests.swift */; }; - A92CAAC629F7D33C008ED922 /* TunnelTransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92CAAC529F7D33C008ED922 /* TunnelTransportProvider.swift */; }; + A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 586F2BE129F6916F009E6924 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; }; + A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */; }; + A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */; }; + A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; }; + A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A97FF54B2A0B7AD000900996 /* SimulatorTunnelTransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97FF54A2A0B7AD000900996 /* SimulatorTunnelTransportProvider.swift */; }; A97FF5502A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */; }; + A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; }; A9CF11FD2A0518E7001D9565 /* AddressCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9CF11FC2A0518E7001D9565 /* AddressCacheTests.swift */; }; + A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */; }; + A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */; }; + A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; }; + A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; + A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; }; E1187ABC289BBB850024E748 /* OutOfTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */; }; E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; }; E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; }; @@ -588,6 +595,55 @@ remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; remoteInfo = MullvadREST; }; + A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE; + remoteInfo = MullvadTransport; + }; + A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; + remoteInfo = MullvadREST; + }; + A9D99B9B2A1F7DF800DE27D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; + remoteInfo = MullvadREST; + }; + A9D99B9D2A1F7E0300DE27D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE; + remoteInfo = MullvadTransport; + }; + A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 063F02722902B63F001FA09F; + remoteInfo = RelayCache; + }; + A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5898D29729017DAC00EB5EBA; + remoteInfo = RelaySelector; + }; + A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 58CE5E58224146200008646E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE; + remoteInfo = MullvadTransport; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -601,6 +657,7 @@ 58D223FA294C8FF10029F5F8 /* MullvadLogging.framework in Embed Frameworks */, 06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */, 58D223CD294C8BCB0029F5F8 /* Operations.framework in Embed Frameworks */, + A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */, 063F027A2902B63F001FA09F /* RelayCache.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -980,10 +1037,12 @@ 7AF0419D29E957EB00D492DD /* AccountCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountCoordinator.swift; sourceTree = "<group>"; }; A917351E29FAA9C400D5DCFD /* RESTTransportStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTTransportStrategy.swift; sourceTree = "<group>"; }; A917352029FAAA5200D5DCFD /* TransportStrategyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransportStrategyTests.swift; sourceTree = "<group>"; }; - A92CAAC529F7D33C008ED922 /* TunnelTransportProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelTransportProvider.swift; sourceTree = "<group>"; }; + A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MullvadTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MullvadTransport.h; sourceTree = "<group>"; }; A97FF54A2A0B7AD000900996 /* SimulatorTunnelTransportProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimulatorTunnelTransportProvider.swift; sourceTree = "<group>"; }; A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSFileCoordinator+Extensions.swift"; sourceTree = "<group>"; }; A9CF11FC2A0518E7001D9565 /* AddressCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressCacheTests.swift; sourceTree = "<group>"; }; + A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = "<group>"; }; E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeViewController.swift; sourceTree = "<group>"; }; E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = "<group>"; }; E158B35F285381C60002F069 /* String+AccountFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AccountFormatting.swift"; sourceTree = "<group>"; }; @@ -1006,7 +1065,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */, 58D223BF294C8AE90029F5F8 /* Operations.framework in Frameworks */, 58D2241D294C91D20029F5F8 /* MullvadLogging.framework in Frameworks */, 58D223DC294C8EB90029F5F8 /* MullvadTypes.framework in Frameworks */, @@ -1059,6 +1117,7 @@ 58D223CC294C8BCB0029F5F8 /* Operations.framework in Frameworks */, 06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */, 063F02792902B63F001FA09F /* RelayCache.framework in Frameworks */, + A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */, 5807483B27DB8A980020ECBF /* WireGuardKitTypes in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1067,6 +1126,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */, 5898D2AB2901845400EB5EBA /* libRelaySelector.a in Frameworks */, 5898D2AC2901845400EB5EBA /* libTunnelProviderMessaging.a in Frameworks */, 58D223EA294C8F3C0029F5F8 /* MullvadTypes.framework in Frameworks */, @@ -1115,6 +1175,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */, + A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */, + A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */, + 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1151,7 +1222,6 @@ 582FFA82290A84E700895745 /* Info.plist */, 062B45A228FD4C0F00746E77 /* Assets */, 06799ABE28F98E1D00ACD94E /* MullvadREST.h */, - 586F2BE129F6916F009E6924 /* shadowsocks.h */, 06AC114128F8413A0037AF9A /* AddressCache.swift */, 06FAE67128F83CA40033DD93 /* HTTP.swift */, 06FAE67B28F83CA50033DD93 /* REST.swift */, @@ -1780,6 +1850,7 @@ 5898D28A29017BD400EB5EBA /* TunnelProviderMessaging */, 589A455328E094B300565204 /* OperationsTests */, 58CE5E7A224146470008646E /* PacketTunnel */, + A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */, 58CE5E61224146200008646E /* Products */, 584F991F2902CBDD001F858D /* Frameworks */, ); @@ -1801,6 +1872,7 @@ 58D223A5294C8A480029F5F8 /* Operations.framework */, 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */, 58D223F3294C8FF00029F5F8 /* MullvadLogging.framework */, + A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */, ); name = Products; sourceTree = "<group>"; @@ -1846,7 +1918,6 @@ 58E07298288031D5008902F8 /* WireGuardAdapterError+Localization.swift */, 58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */, 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */, - A92CAAC529F7D33C008ED922 /* TunnelTransportProvider.swift */, ); path = PacketTunnel; sourceTree = "<group>"; @@ -1966,6 +2037,18 @@ path = MullvadRESTTests; sourceTree = "<group>"; }; + A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */ = { + isa = PBXGroup; + children = ( + 586F2BE129F6916F009E6924 /* shadowsocks.h */, + 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */, + 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */, + A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */, + A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */, + ); + path = MullvadTransport; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1981,7 +2064,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 586F2BE229F6916F009E6924 /* shadowsocks.h in Headers */, 06799ACE28F98E1D00ACD94E /* MullvadREST.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2010,6 +2092,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A97F1F3C2A1F4E1A00ECEFDE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */, + A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXLegacyTarget section */ @@ -2057,7 +2148,6 @@ isa = PBXNativeTarget; buildConfigurationList = 06799AD328F98E1D00ACD94E /* Build configuration list for PBXNativeTarget "MullvadREST" */; buildPhases = ( - 01F1FF1F29F07D63007083C3 /* ShellScript */, 06799AB728F98E1D00ACD94E /* Headers */, 06799AB828F98E1D00ACD94E /* Sources */, 06799AB928F98E1D00ACD94E /* Frameworks */, @@ -2090,6 +2180,8 @@ buildRules = ( ); dependencies = ( + A9D99B9E2A1F7E0300DE27D3 /* PBXTargetDependency */, + A9D99B9C2A1F7DF800DE27D3 /* PBXTargetDependency */, 58D2242C294C94760029F5F8 /* PBXTargetDependency */, ); name = TunnelProviderMessaging; @@ -2174,6 +2266,7 @@ 58D223CF294C8BCB0029F5F8 /* PBXTargetDependency */, 063F02782902B63F001FA09F /* PBXTargetDependency */, 58CE5E80224146470008646E /* PBXTargetDependency */, + A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */, ); name = MullvadVPN; packageProductDependencies = ( @@ -2194,6 +2287,7 @@ buildRules = ( ); dependencies = ( + A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */, 58D22432294C94890029F5F8 /* PBXTargetDependency */, 58D22434294C94890029F5F8 /* PBXTargetDependency */, 58D223ED294C8F3D0029F5F8 /* PBXTargetDependency */, @@ -2308,6 +2402,28 @@ productReference = 58FBFBE6291622580020E046 /* MullvadRESTTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */ = { + isa = PBXNativeTarget; + buildConfigurationList = A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */; + buildPhases = ( + A95F86B92A1F54F800245DAC /* ShellScript */, + A97F1F3C2A1F4E1A00ECEFDE /* Headers */, + A97F1F3D2A1F4E1A00ECEFDE /* Sources */, + A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */, + A97F1F3F2A1F4E1A00ECEFDE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */, + A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */, + A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */, + ); + name = MullvadTransport; + productName = MullvadTransport; + productReference = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -2376,6 +2492,9 @@ 58FBFBE5291622580020E046 = { CreatedOnToolsVersion = 14.1; }; + A97F1F402A1F4E1A00ECEFDE = { + CreatedOnToolsVersion = 14.3; + }; }; }; buildConfigurationList = 58CE5E5B224146200008646E /* Build configuration list for PBXProject "MullvadVPN" */; @@ -2409,6 +2528,7 @@ 5898D28829017BD300EB5EBA /* TunnelProviderMessaging */, 58D223D4294C8E5E0029F5F8 /* MullvadTypes */, 58D223F2294C8FF00029F5F8 /* MullvadLogging */, + A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */, ); }; /* End PBXProject section */ @@ -2498,10 +2618,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A97F1F3F2A1F4E1A00ECEFDE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01F1FF1F29F07D63007083C3 /* ShellScript */ = { + 063F028D2902BC8E001FA09F /* Run prebuild script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -2511,15 +2638,16 @@ ); inputPaths = ( ); + name = "Run prebuild script"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nCARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/MullvadREST/shadowsocks-proxy/build.sh shadowsocks-proxy\n"; + shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n"; }; - 063F028D2902BC8E001FA09F /* Run prebuild script */ = { + A95F86B92A1F54F800245DAC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -2529,14 +2657,13 @@ ); inputPaths = ( ); - name = "Run prebuild script"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n"; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nCARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/MullvadTransport/shadowsocks-proxy/build.sh shadowsocks-proxy\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -2558,20 +2685,18 @@ 06799AF428F98E4800ACD94E /* RESTAuthorization.swift in Sources */, 06799AE228F98E4800ACD94E /* RESTRequestFactory.swift in Sources */, 06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */, - 06799ADC28F98E4800ACD94E /* RESTTransport.swift in Sources */, 06799ADE28F98E4800ACD94E /* RESTRequestHandler.swift in Sources */, - 06799AEE28F98E4800ACD94E /* URLSessionTransport.swift in Sources */, 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */, 06799AE128F98E4800ACD94E /* SSLPinningURLSessionDelegate.swift in Sources */, 06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */, 06799ADD28F98E4800ACD94E /* RESTError.swift in Sources */, 06799ADB28F98E4800ACD94E /* RESTProxyFactory.swift in Sources */, - 01F1FF1C29F06124007083C3 /* ShadowsocksProxy.swift in Sources */, 06799AF228F98E4800ACD94E /* RESTAccessTokenManager.swift in Sources */, 06799AF328F98E4800ACD94E /* RESTAuthenticationProxy.swift in Sources */, 06799AE628F98E4800ACD94E /* ServerRelaysResponse.swift in Sources */, 06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */, 06799AE528F98E4800ACD94E /* HTTP.swift in Sources */, + A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */, 06799AE028F98E4800ACD94E /* RESTCoding.swift in Sources */, 06799AFC28F98EE300ACD94E /* AddressCache.swift in Sources */, 5897F1762914E62E00AF5695 /* Duration.swift in Sources */, @@ -2863,7 +2988,6 @@ 583FE02429C1ACB3006E85F9 /* RESTCreateApplePaymentResponse+Localization.swift in Sources */, 5877D70F282137E8002FCFC7 /* SettingsManager.swift in Sources */, 58CE38C728992C8700A6D6E5 /* WireGuardAdapterError+Localization.swift in Sources */, - A92CAAC629F7D33C008ED922 /* TunnelTransportProvider.swift in Sources */, 58E511E828DDDF2400B0BCDE /* CodingErrors+CustomErrorDescription.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2958,6 +3082,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A97F1F3D2A1F4E1A00ECEFDE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */, + A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */, + A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -3111,6 +3245,41 @@ target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; targetProxy = 58FBFBEB291622580020E046 /* PBXContainerItemProxy */; }; + A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */; + targetProxy = A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */; + }; + A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; + targetProxy = A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */; + }; + A9D99B9C2A1F7DF800DE27D3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; + targetProxy = A9D99B9B2A1F7DF800DE27D3 /* PBXContainerItemProxy */; + }; + A9D99B9E2A1F7E0300DE27D3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */; + targetProxy = A9D99B9D2A1F7E0300DE27D3 /* PBXContainerItemProxy */; + }; + A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 063F02722902B63F001FA09F /* RelayCache */; + targetProxy = A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */; + }; + A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5898D29729017DAC00EB5EBA /* RelaySelector */; + targetProxy = A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */; + }; + A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */; + targetProxy = A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -3211,10 +3380,6 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug"; - MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/module.private.modulemap; PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -3247,10 +3412,6 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release"; - MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/module.private.modulemap; PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -3870,6 +4031,96 @@ }; name = Release; }; + A97F1F492A1F4E1A00ECEFDE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=*]" = "Apple Development"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = CKG9MXH72F; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved."; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug"; + MARKETING_VERSION = 2023.2; + MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap; + PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A97F1F4A2A1F4E1A00ECEFDE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=*]" = "Apple Development"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = CKG9MXH72F; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved."; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release"; + MARKETING_VERSION = 2023.2; + MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap; + PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -4008,6 +4259,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A97F1F492A1F4E1A00ECEFDE /* Debug */, + A97F1F4A2A1F4E1A00ECEFDE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift index b5ee97034d..43a3483309 100644 --- a/ios/MullvadVPN/AppDelegate.swift +++ b/ios/MullvadVPN/AppDelegate.swift @@ -9,6 +9,7 @@ import BackgroundTasks import MullvadLogging import MullvadREST +import MullvadTransport import Operations import RelayCache import StoreKit @@ -67,7 +68,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD accountsProxy = proxyFactory.createAccountsProxy() devicesProxy = proxyFactory.createDevicesProxy() - relayCacheTracker = RelayCacheTracker(application: application, apiProxy: apiProxy) + let relayCache = RelayCache( + securityGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier + )! + + relayCacheTracker = RelayCacheTracker(relayCache: relayCache, application: application, apiProxy: apiProxy) addressCacheTracker = AddressCacheTracker( application: application, @@ -92,11 +97,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD accountsProxy: accountsProxy ) + let urlSessionTransport = URLSessionTransport(urlSession: REST.makeURLSession()) + let transportProvider = TransportProvider( + urlSessionTransport: urlSessionTransport, + relayCache: relayCache, + addressCache: addressCache + ) + transportMonitor = TransportMonitor( tunnelManager: tunnelManager, tunnelStore: tunnelStore, - relayCacheTracker: relayCacheTracker, - addressCache: addressCache + transportProvider: transportProvider ) #if targetEnvironment(simulator) diff --git a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift index a5f7802859..953645cd8d 100644 --- a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift +++ b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift @@ -22,9 +22,7 @@ final class RelayCacheTracker { private let logger = Logger(label: "RelayCacheTracker") /// Relay cache. - private let cache = RelayCache( - securityGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier - )! + private let cache: RelayCache private let application: UIApplication @@ -49,9 +47,10 @@ final class RelayCacheTracker { /// Memory cache. private var cachedRelays: CachedRelays? - init(application: UIApplication, apiProxy: REST.APIProxy) { + init(relayCache: RelayCache, application: UIApplication, apiProxy: REST.APIProxy) { self.application = application self.apiProxy = apiProxy + cache = relayCache do { cachedRelays = try cache.read() diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift index c8741ace52..304d9be8e2 100644 --- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift +++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift @@ -11,6 +11,7 @@ import Foundation import MullvadLogging import MullvadREST +import MullvadTransport import MullvadTypes import enum NetworkExtension.NEProviderStopReason import RelayCache @@ -30,7 +31,7 @@ final class SimulatorTunnelProviderHost: SimulatorTunnelProviderDelegate { self.relayCacheTracker = relayCacheTracker let urlSession = REST.makeURLSession() - let urlSessionTransport = REST.URLSessionTransport(urlSession: urlSession) + let urlSessionTransport = URLSessionTransport(urlSession: urlSession) let simulatorTransportProvider = SimulatorTunnelTransportProvider(urlSessionTransport: urlSessionTransport) self.simulatorTransportProvider = simulatorTransportProvider diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelTransportProvider.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelTransportProvider.swift index a571101e3f..87f5cf62e8 100644 --- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelTransportProvider.swift +++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelTransportProvider.swift @@ -8,19 +8,20 @@ import Foundation import MullvadREST +import MullvadTransport final class SimulatorTunnelTransportProvider: RESTTransportProvider { - private let urlSessionTransport: REST.URLSessionTransport + private let urlSessionTransport: URLSessionTransport - init(urlSessionTransport: REST.URLSessionTransport) { + init(urlSessionTransport: URLSessionTransport) { self.urlSessionTransport = urlSessionTransport } - func transport() -> MullvadREST.RESTTransport? { + func transport() -> RESTTransport? { urlSessionTransport } - func shadowSocksTransport() -> MullvadREST.RESTTransport? { + func shadowsocksTransport() -> RESTTransport? { urlSessionTransport } } diff --git a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift index 15b802f56b..ebb0acefb0 100644 --- a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift +++ b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift @@ -7,7 +7,8 @@ // import Foundation -import protocol MullvadREST.RESTTransport +import MullvadREST +import MullvadTransport import MullvadTypes import Operations import TunnelProviderMessaging diff --git a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift index 710a890e6a..ebc24913b2 100644 --- a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift +++ b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift @@ -9,71 +9,31 @@ import Foundation import MullvadLogging import MullvadREST +import MullvadTransport import RelayCache import RelaySelector final class TransportMonitor: RESTTransportProvider { private let tunnelManager: TunnelManager private let tunnelStore: TunnelStore - private let urlSessionTransport: REST.URLSessionTransport - private let relayCacheTracker: RelayCacheTracker - private let logger = Logger(label: "TransportMonitor") - private let addressCache: REST.AddressCache + private let transportProvider: TransportProvider // MARK: - // MARK: Public API - init( - tunnelManager: TunnelManager, - tunnelStore: TunnelStore, - relayCacheTracker: RelayCacheTracker, - addressCache: REST.AddressCache - ) { + init(tunnelManager: TunnelManager, tunnelStore: TunnelStore, transportProvider: TransportProvider) { self.tunnelManager = tunnelManager self.tunnelStore = tunnelStore - self.relayCacheTracker = relayCacheTracker - self.addressCache = addressCache - - urlSessionTransport = REST.URLSessionTransport(urlSession: REST.makeURLSession()) + self.transportProvider = transportProvider } - public func transport() -> MullvadREST.RESTTransport? { - return selectTransport(urlSessionTransport, useShadowsocksTransport: false) + public func transport() -> RESTTransport? { + return selectTransport(transportProvider.transport(), useShadowsocksTransport: false) } - public func shadowSocksTransport() -> RESTTransport? { - let shadowSocksTransport: RESTTransport - do { - let cachedRelays = try relayCacheTracker.getCachedRelays() - - let shadowSocksConfiguration = RelaySelector.getShadowsocksTCPBridge(relays: cachedRelays.relays) - let shadowSocksBridgeRelay = RelaySelector.getShadowSocksRelay(relays: cachedRelays.relays) - - guard let shadowSocksConfiguration, - let shadowSocksBridgeRelay - else { - logger.error("Could not get shadow socks bridge information.") - return nil - } - - let shadowSocksURLSession = urlSessionTransport.urlSession - let transport = REST.URLSessionShadowSocksTransport( - urlSession: shadowSocksURLSession, - shadowSocksConfiguration: shadowSocksConfiguration, - shadowSocksBridgeRelay: shadowSocksBridgeRelay, - addressCache: addressCache - ) - - shadowSocksTransport = transport - } catch { - logger.error( - error: error, - message: "Could not create shadow socks transport." - ) - return nil - } - return selectTransport(shadowSocksTransport, useShadowsocksTransport: true) + public func shadowsocksTransport() -> RESTTransport? { + return selectTransport(transportProvider.shadowsocksTransport(), useShadowsocksTransport: true) } // MARK: - @@ -91,7 +51,7 @@ final class TransportMonitor: RESTTransportProvider { /// - useShadowsocksTransport: A hint for enforcing a Shadowsocks transport when proxying a request via an /// available `Tunnel` /// - Returns: A transport to use for sending an `URLRequest` - private func selectTransport(_ transport: RESTTransport, useShadowsocksTransport: Bool) -> RESTTransport { + private func selectTransport(_ transport: RESTTransport?, useShadowsocksTransport: Bool) -> RESTTransport? { let tunnel = tunnelStore.getPersistentTunnels().first { tunnel in return tunnel.status == .connecting || tunnel.status == .reasserting || diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift index d58b4e0e51..e58429838d 100644 --- a/ios/PacketTunnel/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider.swift @@ -9,6 +9,7 @@ import Foundation import MullvadLogging import MullvadREST +import MullvadTransport import MullvadTypes import Network import NetworkExtension @@ -151,8 +152,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider, TunnelMonitorDelegate { ) let urlSession = REST.makeURLSession() - let urlSessionTransport = REST.URLSessionTransport(urlSession: urlSession) - let transportProvider = TunnelTransportProvider( + let urlSessionTransport = URLSessionTransport(urlSession: urlSession) + let transportProvider = TransportProvider( urlSessionTransport: urlSessionTransport, relayCache: relayCache, addressCache: addressCache diff --git a/ios/PacketTunnel/TunnelTransportProvider.swift b/ios/PacketTunnel/TunnelTransportProvider.swift deleted file mode 100644 index 417f6904ff..0000000000 --- a/ios/PacketTunnel/TunnelTransportProvider.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// TunnelTransportProvider.swift -// PacketTunnel -// -// Created by Marco Nikic on 2023-04-25. -// Copyright © 2023 Mullvad VPN AB. All rights reserved. -// - -import Foundation -import Logging -import MullvadREST -import RelayCache -import RelaySelector - -final class TunnelTransportProvider: RESTTransportProvider { - private let urlSessionTransport: REST.URLSessionTransport - private let relayCache: RelayCache - private let logger = Logger(label: "TunnelTransportProvider") - private let addressCache: REST.AddressCache - - init(urlSessionTransport: REST.URLSessionTransport, relayCache: RelayCache, addressCache: REST.AddressCache) { - self.urlSessionTransport = urlSessionTransport - self.relayCache = relayCache - self.addressCache = addressCache - } - - func transport() -> MullvadREST.RESTTransport? { - urlSessionTransport - } - - func shadowSocksTransport() -> MullvadREST.RESTTransport? { - do { - let cachedRelays = try relayCache.read() - let shadowSocksConfiguration = RelaySelector.getShadowsocksTCPBridge(relays: cachedRelays.relays) - let shadowSocksBridgeRelay = RelaySelector.getShadowSocksRelay(relays: cachedRelays.relays) - - guard let shadowSocksConfiguration, - let shadowSocksBridgeRelay - else { - logger.error("Could not get shadow socks bridge information.") - return nil - } - - let shadowSocksURLSession = urlSessionTransport.urlSession - let shadowSocksTransport = REST.URLSessionShadowSocksTransport( - urlSession: shadowSocksURLSession, - shadowSocksConfiguration: shadowSocksConfiguration, - shadowSocksBridgeRelay: shadowSocksBridgeRelay, - addressCache: addressCache - ) - - return shadowSocksTransport - } catch { - logger.error(error: error) - } - return nil - } -} diff --git a/ios/RelaySelector/RelaySelector.swift b/ios/RelaySelector/RelaySelector.swift index 6fa91673cc..38a1c4d3ab 100644 --- a/ios/RelaySelector/RelaySelector.swift +++ b/ios/RelaySelector/RelaySelector.swift @@ -23,7 +23,7 @@ public enum RelaySelector { /// Return a random Shadowsocks bridge relay, or `nil` if no relay were found. /// - Parameter relays: The list of relays to randomly select from /// - Returns: A Shadowsocks relay or `nil` if no relay were found. - public static func getShadowSocksRelay(relays: REST.ServerRelaysResponse) -> REST.BridgeRelay? { + public static func getShadowsocksRelay(relays: REST.ServerRelaysResponse) -> REST.BridgeRelay? { relays.bridge.relays.randomElement() } diff --git a/ios/TunnelProviderMessaging/URLRequestProxy.swift b/ios/TunnelProviderMessaging/URLRequestProxy.swift index 2ffb9f0a56..defa7822e4 100644 --- a/ios/TunnelProviderMessaging/URLRequestProxy.swift +++ b/ios/TunnelProviderMessaging/URLRequestProxy.swift @@ -8,6 +8,7 @@ import Foundation import MullvadREST +import MullvadTransport import MullvadTypes public final class URLRequestProxy { @@ -35,7 +36,7 @@ public final class URLRequestProxy { // Instruct the Packet Tunnel to try to reach the API via the local shadow socks proxy instance if needed let transportProvider = self.transportProvider() let transport = proxyRequest.useShadowsocksTransport - ? transportProvider?.shadowSocksTransport() + ? transportProvider?.shadowsocksTransport() : transportProvider?.transport() guard let transport else { return } // The task sent by `transport.sendRequest` comes in an already resumed state |
