Skip to content

Commit 990977e

Browse files
committed
Add data-driven TunnelSettingsUpdate type and method for atomically applying them, modify Preferences{Interactor,ViewController} to use these.
1 parent 3a7fdd4 commit 990977e

File tree

5 files changed

+73
-35
lines changed

5 files changed

+73
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// TunnelSettingsUpdate.swift
3+
// MullvadSettings
4+
//
5+
// Created by Andrew Bulhak on 2024-02-13.
6+
// Copyright © 2024 Mullvad VPN AB. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import MullvadTypes
11+
12+
public enum TunnelSettingsUpdate {
13+
case dnsSettings(DNSSettings)
14+
case obfuscation(WireGuardObfuscationSettings)
15+
case relayConstraints(RelayConstraints)
16+
case quantumResistance(TunnelQuantumResistance)
17+
}
18+
19+
extension TunnelSettingsUpdate {
20+
public func apply(to settings: inout LatestTunnelSettings) {
21+
switch self {
22+
case let .dnsSettings(newDNSSettings):
23+
settings.dnsSettings = newDNSSettings
24+
case let .obfuscation(newObfuscationSettings):
25+
settings.wireGuardObfuscation = newObfuscationSettings
26+
case let .relayConstraints(newRelayConstraints):
27+
settings.relayConstraints = newRelayConstraints
28+
case let .quantumResistance(newQuantumResistance):
29+
settings.tunnelQuantumResistance = newQuantumResistance
30+
}
31+
}
32+
33+
public var subjectName: String {
34+
switch self {
35+
case .dnsSettings: "DNS settings"
36+
case .obfuscation: "obfuscation settings"
37+
case .relayConstraints: "relay constraints"
38+
case .quantumResistance: "quantum resistance"
39+
}
40+
}
41+
}

ios/MullvadVPN.xcodeproj/project.pbxproj

+6-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@
3838
06799AFC28F98EE300ACD94E /* AddressCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114128F8413A0037AF9A /* AddressCache.swift */; };
3939
0697D6E728F01513007A9E99 /* TransportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0697D6E628F01513007A9E99 /* TransportMonitor.swift */; };
4040
06AC116228F94C450037AF9A /* ApplicationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BFA5CB22A7CE1F00A6173D /* ApplicationConfiguration.swift */; };
41-
44DD7D2D2B74E44A0005F67F /* QuantumResistanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D2C2B74E44A0005F67F /* QuantumResistanceSettings.swift */; };
41+
449872E12B7BBC5400094DDC /* TunnelSettingsUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 449872E02B7BBC5400094DDC /* TunnelSettingsUpdate.swift */; };
4242
44DD7D242B6CFFD70005F67F /* StartTunnelOperationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D232B6CFFD70005F67F /* StartTunnelOperationTests.swift */; };
4343
44DD7D272B6D18FB0005F67F /* MockTunnelInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D262B6D18FB0005F67F /* MockTunnelInteractor.swift */; };
4444
44DD7D292B7113CA0005F67F /* MockTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D282B7113CA0005F67F /* MockTunnel.swift */; };
45+
44DD7D2D2B74E44A0005F67F /* QuantumResistanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D2C2B74E44A0005F67F /* QuantumResistanceSettings.swift */; };
4546
5803B4B02940A47300C23744 /* TunnelConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5803B4AF2940A47300C23744 /* TunnelConfiguration.swift */; };
4647
5803B4B22940A48700C23744 /* TunnelStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5803B4B12940A48700C23744 /* TunnelStore.swift */; };
4748
5807E2C02432038B00F5FF30 /* String+Split.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5807E2BF2432038B00F5FF30 /* String+Split.swift */; };
@@ -1245,10 +1246,11 @@
12451246
06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTDevicesProxy.swift; sourceTree = "<group>"; };
12461247
06FAE67B28F83CA50033DD93 /* REST.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = REST.swift; sourceTree = "<group>"; };
12471248
06FAE67D28F83CA50033DD93 /* RESTTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransport.swift; sourceTree = "<group>"; };
1248-
44DD7D2C2B74E44A0005F67F /* QuantumResistanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuantumResistanceSettings.swift; sourceTree = "<group>"; };
1249+
449872E02B7BBC5400094DDC /* TunnelSettingsUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelSettingsUpdate.swift; sourceTree = "<group>"; };
12491250
44DD7D232B6CFFD70005F67F /* StartTunnelOperationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartTunnelOperationTests.swift; sourceTree = "<group>"; };
12501251
44DD7D262B6D18FB0005F67F /* MockTunnelInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTunnelInteractor.swift; sourceTree = "<group>"; };
12511252
44DD7D282B7113CA0005F67F /* MockTunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTunnel.swift; sourceTree = "<group>"; };
1253+
44DD7D2C2B74E44A0005F67F /* QuantumResistanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuantumResistanceSettings.swift; sourceTree = "<group>"; };
12521254
5802EBC42A8E44AC00E5CE4C /* AppRoutes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRoutes.swift; sourceTree = "<group>"; };
12531255
5802EBC62A8E457A00E5CE4C /* AppRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRouteProtocol.swift; sourceTree = "<group>"; };
12541256
5802EBC82A8E45BA00E5CE4C /* ApplicationRouterDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationRouterDelegate.swift; sourceTree = "<group>"; };
@@ -2862,6 +2864,7 @@
28622864
580F8B8228197881002E0998 /* TunnelSettingsV2.swift */,
28632865
A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */,
28642866
A93181A02B727ED700E341D2 /* TunnelSettingsV4.swift */,
2867+
449872E02B7BBC5400094DDC /* TunnelSettingsUpdate.swift */,
28652868
A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */,
28662869
);
28672870
path = MullvadSettings;
@@ -4706,6 +4709,7 @@
47064709
58B2FDDE2AA71D5C003EB5C6 /* Migration.swift in Sources */,
47074710
F0D7FF8F2B31DF5900E0FDE5 /* AccessMethodRepository.swift in Sources */,
47084711
58B2FDE12AA71D5C003EB5C6 /* TunnelSettingsV1.swift in Sources */,
4712+
449872E12B7BBC5400094DDC /* TunnelSettingsUpdate.swift in Sources */,
47094713
58B2FDE72AA71D5C003EB5C6 /* SettingsStore.swift in Sources */,
47104714
44DD7D2D2B74E44A0005F67F /* QuantumResistanceSettings.swift in Sources */,
47114715
F08827872B318C840020A383 /* ShadowsocksCipherOptions.swift in Sources */,

ios/MullvadVPN/TunnelManager/TunnelManager.swift

+13-20
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,19 @@ final class TunnelManager: StorePaymentObserver {
503503
return operation
504504
}
505505

506+
func updateSettings(_ updates: [TunnelSettingsUpdate], completionHandler: (() -> Void)? = nil) {
507+
let taskName = "Set " + updates.map(\.subjectName).joined(separator: ", ")
508+
scheduleSettingsUpdate(
509+
taskName: taskName,
510+
modificationBlock: { settings in
511+
for update in updates {
512+
update.apply(to: &settings)
513+
}
514+
},
515+
completionHandler: completionHandler
516+
)
517+
}
518+
506519
func setRelayConstraints(
507520
_ newConstraints: RelayConstraints,
508521
completionHandler: (() -> Void)? = nil
@@ -526,26 +539,6 @@ final class TunnelManager: StorePaymentObserver {
526539
)
527540
}
528541

529-
func setObfuscationSettings(_ newSettings: WireGuardObfuscationSettings) {
530-
scheduleSettingsUpdate(
531-
taskName: "Set obfuscation settings",
532-
modificationBlock: { settings in
533-
settings.wireGuardObfuscation = newSettings
534-
},
535-
completionHandler: nil
536-
)
537-
}
538-
539-
func setQuantumResistance(_ newSetting: TunnelQuantumResistance) {
540-
scheduleSettingsUpdate(
541-
taskName: "Set quantum resistance",
542-
modificationBlock: { settings in
543-
settings.tunnelQuantumResistance = newSetting
544-
},
545-
completionHandler: nil
546-
)
547-
}
548-
549542
func refreshRelayCacheTracker() throws {
550543
try relayCacheTracker.refreshCachedRelays()
551544
}

ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift

+4-8
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ final class PreferencesInteractor {
3636
})
3737
}
3838

39-
func setDNSSettings(_ newDNSSettings: DNSSettings, completion: (() -> Void)? = nil) {
40-
tunnelManager.setDNSSettings(newDNSSettings, completionHandler: completion)
39+
func updateSettings(_ changes: [TunnelSettingsUpdate], completion: (() -> Void)? = nil) {
40+
tunnelManager.updateSettings(changes, completionHandler: completion)
4141
}
4242

43-
func setObfuscationSettings(_ newSettings: WireGuardObfuscationSettings) {
44-
tunnelManager.setObfuscationSettings(newSettings)
43+
func setDNSSettings(_ newDNSSettings: DNSSettings, completion: (() -> Void)? = nil) {
44+
tunnelManager.setDNSSettings(newDNSSettings, completionHandler: completion)
4545
}
4646

4747
func setPort(_ port: UInt16?, completion: (() -> Void)? = nil) {
@@ -55,10 +55,6 @@ final class PreferencesInteractor {
5555

5656
tunnelManager.setRelayConstraints(relayConstraints, completionHandler: completion)
5757
}
58-
59-
func setQuantumResistance(_ newSetting: TunnelQuantumResistance) {
60-
tunnelManager.setQuantumResistance(newSetting)
61-
}
6258
}
6359

6460
extension PreferencesInteractor: RelayCacheTrackerObserver {

ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift

+9-5
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,15 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
101101
// MARK: - PreferencesDataSourceDelegate
102102

103103
func didChangeViewModel(_ viewModel: PreferencesViewModel) {
104-
interactor.setObfuscationSettings(WireGuardObfuscationSettings(
105-
state: viewModel.obfuscationState,
106-
port: viewModel.obfuscationPort
107-
))
108-
interactor.setQuantumResistance(viewModel.quantumResistance)
104+
interactor.updateSettings(
105+
[
106+
.obfuscation(WireGuardObfuscationSettings(
107+
state: viewModel.obfuscationState,
108+
port: viewModel.obfuscationPort
109+
)),
110+
.quantumResistance(viewModel.quantumResistance),
111+
]
112+
)
109113
}
110114

111115
func showInfo(for item: PreferencesInfoButtonItem) {

0 commit comments

Comments
 (0)