Skip to content

Commit ba64441

Browse files
committed
UI: When saving on-demand rules on a config, enable on-demand if active
When a user saves on-demand rules on the configuration, set onDemandEnabled to true if the tunnel is active, and false if it isn't. Then deactivate the tunnel. Signed-off-by: Roopesh Chander <[email protected]>
1 parent 10da5cf commit ba64441

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ extension ActivateOnDemandOption {
4242
}
4343
}
4444
tunnelProviderManager.onDemandRules = rules
45-
tunnelProviderManager.isOnDemandEnabled = false
45+
let status = tunnelProviderManager.connection.status
46+
let isActive = status == .connected || status == .connecting
47+
tunnelProviderManager.isOnDemandEnabled = (rules != nil) && (tunnelProviderManager.isOnDemandEnabled || isActive)
4648
}
4749

4850
init(from tunnelProviderManager: NETunnelProviderManager) {

Sources/WireGuardApp/Tunnel/TunnelsManager.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,10 @@ class TunnelsManager {
231231
}
232232
tunnelProviderManager.isEnabled = true
233233

234-
let isActivatingOnDemand = !tunnelProviderManager.isOnDemandEnabled && onDemandOption != .off
234+
let wasOnDemandEnabled = tunnelProviderManager.isOnDemandEnabled
235+
let isIntroducingOnDemandRules = (tunnelProviderManager.onDemandRules ?? []).isEmpty && onDemandOption != .off
235236
onDemandOption.apply(on: tunnelProviderManager)
237+
let isActivatingOnDemand = !wasOnDemandEnabled && tunnelProviderManager.isOnDemandEnabled
236238

237239
tunnelProviderManager.saveToPreferences { [weak self] error in
238240
if let error = error {
@@ -264,8 +266,11 @@ class TunnelsManager {
264266
if isActivatingOnDemand {
265267
// Reload tunnel after saving.
266268
// Without this, the tunnel stopes getting updates on the tunnel status from iOS.
267-
tunnelProviderManager.loadFromPreferences { error in
269+
tunnelProviderManager.loadFromPreferences { [weak self] error in
268270
tunnel.isActivateOnDemandEnabled = tunnelProviderManager.isOnDemandEnabled
271+
if isIntroducingOnDemandRules {
272+
self?.startDeactivation(of: tunnel)
273+
}
269274
if let error = error {
270275
wg_log(.error, message: "Modify: Re-loading after saving configuration failed: \(error)")
271276
completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error))
@@ -274,6 +279,9 @@ class TunnelsManager {
274279
}
275280
}
276281
} else {
282+
if isIntroducingOnDemandRules {
283+
self.startDeactivation(of: tunnel)
284+
}
277285
completionHandler(nil)
278286
}
279287
}

0 commit comments

Comments
 (0)