summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2023-05-29 16:45:59 +0200
committerEmīls <emils@mullvad.net>2023-05-29 16:45:59 +0200
commitfb49b1e742f28bc526f96f1e1b281be37a4b876e (patch)
tree45cbf6d694450ea95d02f1be8ea370f19133cba3
parent1205787ca4182977272be73bc9ee49f1bf8db06d (diff)
parentfc7b61857e888d14f39e5361e1f287aa039ce19b (diff)
downloadmullvadvpn-fb49b1e742f28bc526f96f1e1b281be37a4b876e.tar.xz
mullvadvpn-fb49b1e742f28bc526f96f1e1b281be37a4b876e.zip
Merge branch 'introduce-mullvadtransport-ios-181'
-rw-r--r--Cargo.toml2
-rw-r--r--ios/MullvadREST/RESTNetworkOperation.swift4
-rw-r--r--ios/MullvadREST/RESTTransport.swift3
-rw-r--r--ios/MullvadREST/RESTTransportStrategy.swift60
-rw-r--r--ios/MullvadRESTTests/TransportStrategyTests.swift12
-rw-r--r--ios/MullvadTransport/Info.plist5
-rw-r--r--ios/MullvadTransport/MullvadTransport.h19
-rw-r--r--ios/MullvadTransport/ShadowSocksProxy.swift (renamed from ios/MullvadREST/ShadowSocksProxy.swift)2
-rw-r--r--ios/MullvadTransport/TransportProvider.swift59
-rw-r--r--ios/MullvadTransport/URLSessionTransport.swift87
-rw-r--r--ios/MullvadTransport/module.private.modulemap (renamed from ios/MullvadREST/module.private.modulemap)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/.gitignore (renamed from ios/MullvadREST/shadowsocks-proxy/.gitignore)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/Cargo.toml (renamed from ios/MullvadREST/shadowsocks-proxy/Cargo.toml)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/build.rs (renamed from ios/MullvadREST/shadowsocks-proxy/build.rs)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/build.sh (renamed from ios/MullvadREST/shadowsocks-proxy/build.sh)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h (renamed from ios/MullvadREST/shadowsocks-proxy/include/shadowsocks.h)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs (renamed from ios/MullvadREST/shadowsocks-proxy/src/bin/run.rs)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs (renamed from ios/MullvadREST/shadowsocks-proxy/src/bin/run_unsafe.rs)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs (renamed from ios/MullvadREST/shadowsocks-proxy/src/ffi.rs)0
-rw-r--r--ios/MullvadTransport/shadowsocks-proxy/src/lib.rs (renamed from ios/MullvadREST/shadowsocks-proxy/src/lib.rs)0
-rw-r--r--ios/MullvadTransport/shadowsocks.h33
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj316
-rw-r--r--ios/MullvadVPN/AppDelegate.swift17
-rw-r--r--ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift7
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift3
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelTransportProvider.swift9
-rw-r--r--ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift3
-rw-r--r--ios/MullvadVPN/TransportMonitor/TransportMonitor.swift58
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift5
-rw-r--r--ios/PacketTunnel/TunnelTransportProvider.swift58
-rw-r--r--ios/RelaySelector/RelaySelector.swift2
-rw-r--r--ios/TunnelProviderMessaging/URLRequestProxy.swift3
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