Make network settings consistent
- Group DNS "Enabled" and protocol into configuration - Make DNS servers / search domains optional - Make proxy bypass domains optional Also refine a comment about future on-demand.
This commit is contained in:
parent
d5340b0457
commit
0db3e36bf4
|
@ -105,6 +105,24 @@ extension Network.Choice {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension Network.DNSSettings.ConfigurationType {
|
||||||
|
var localizedDescription: String {
|
||||||
|
switch self {
|
||||||
|
case .plain:
|
||||||
|
return Unlocalized.DNS.plain
|
||||||
|
|
||||||
|
case .https:
|
||||||
|
return Unlocalized.Network.https
|
||||||
|
|
||||||
|
case .tls:
|
||||||
|
return Unlocalized.Network.tls
|
||||||
|
|
||||||
|
case .disabled:
|
||||||
|
return L10n.Global.Strings.disabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extension Network.ProxySettings.ConfigurationType {
|
extension Network.ProxySettings.ConfigurationType {
|
||||||
var localizedDescription: String {
|
var localizedDescription: String {
|
||||||
switch self {
|
switch self {
|
||||||
|
|
|
@ -48,21 +48,6 @@ extension VPNStatus {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension DNSProtocol {
|
|
||||||
var localizedDescription: String {
|
|
||||||
switch self {
|
|
||||||
case .plain:
|
|
||||||
return Unlocalized.DNS.plain
|
|
||||||
|
|
||||||
case .https:
|
|
||||||
return Unlocalized.Network.https
|
|
||||||
|
|
||||||
case .tls:
|
|
||||||
return Unlocalized.Network.tls
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension DataCount {
|
extension DataCount {
|
||||||
var localizedDescription: String {
|
var localizedDescription: String {
|
||||||
let down = received.descriptionAsDataUnit
|
let down = received.descriptionAsDataUnit
|
||||||
|
|
|
@ -122,29 +122,30 @@ extension NetworkSettingsView {
|
||||||
Toggle(L10n.Global.Strings.automatic, isOn: $settings.isAutomaticDNS.animation())
|
Toggle(L10n.Global.Strings.automatic, isOn: $settings.isAutomaticDNS.animation())
|
||||||
|
|
||||||
if !settings.isAutomaticDNS {
|
if !settings.isAutomaticDNS {
|
||||||
Toggle(L10n.Global.Strings.enabled, isOn: $settings.dns.isDNSEnabled.animation())
|
themeTextPicker(
|
||||||
|
// FIXME: l10n, refactor string id to "global.strings.configuration"
|
||||||
|
L10n.Profile.Sections.Configuration.header,
|
||||||
|
selection: $settings.dns.configurationType,
|
||||||
|
values: Network.DNSSettings.availableConfigurationTypes(forVPNProtocol: vpnProtocol),
|
||||||
|
description: \.localizedDescription
|
||||||
|
)
|
||||||
|
|
||||||
if settings.dns.isDNSEnabled {
|
switch settings.dns.configurationType {
|
||||||
themeTextPicker(
|
case .plain:
|
||||||
L10n.Global.Strings.protocol,
|
EmptyView()
|
||||||
selection: $settings.dns.dnsProtocol,
|
|
||||||
values: Network.DNSSettings.availableProtocols(forVPNProtocol: vpnProtocol),
|
|
||||||
description: \.localizedDescription
|
|
||||||
)
|
|
||||||
switch settings.dns.dnsProtocol {
|
|
||||||
case .plain:
|
|
||||||
EmptyView()
|
|
||||||
|
|
||||||
case .https:
|
case .https:
|
||||||
dnsManualHTTPSRow
|
dnsManualHTTPSRow
|
||||||
|
|
||||||
case .tls:
|
case .tls:
|
||||||
dnsManualTLSRow
|
dnsManualTLSRow
|
||||||
}
|
|
||||||
|
case .disabled:
|
||||||
|
EmptyView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !settings.isAutomaticDNS && settings.dns.isDNSEnabled {
|
if !settings.isAutomaticDNS && settings.dns.configurationType != .disabled {
|
||||||
dnsManualServers
|
dnsManualServers
|
||||||
dnsManualDomains
|
dnsManualDomains
|
||||||
}
|
}
|
||||||
|
@ -163,7 +164,7 @@ extension NetworkSettingsView {
|
||||||
private var dnsManualServers: some View {
|
private var dnsManualServers: some View {
|
||||||
Section {
|
Section {
|
||||||
EditableTextList(
|
EditableTextList(
|
||||||
elements: $settings.dns.dnsServers,
|
elements: $settings.dns.dnsServers ?? [],
|
||||||
allowsDuplicates: false,
|
allowsDuplicates: false,
|
||||||
mapping: mapNotEmpty
|
mapping: mapNotEmpty
|
||||||
) {
|
) {
|
||||||
|
@ -184,7 +185,7 @@ extension NetworkSettingsView {
|
||||||
private var dnsManualDomains: some View {
|
private var dnsManualDomains: some View {
|
||||||
Section {
|
Section {
|
||||||
EditableTextList(
|
EditableTextList(
|
||||||
elements: $settings.dns.dnsSearchDomains,
|
elements: $settings.dns.dnsSearchDomains ?? [],
|
||||||
allowsDuplicates: false,
|
allowsDuplicates: false,
|
||||||
mapping: mapNotEmpty
|
mapping: mapNotEmpty
|
||||||
) {
|
) {
|
||||||
|
@ -250,7 +251,7 @@ extension NetworkSettingsView {
|
||||||
private var proxyManualBypassDomains: some View {
|
private var proxyManualBypassDomains: some View {
|
||||||
Section {
|
Section {
|
||||||
EditableTextList(
|
EditableTextList(
|
||||||
elements: $settings.proxy.proxyBypassDomains,
|
elements: $settings.proxy.proxyBypassDomains ?? [],
|
||||||
allowsDuplicates: false,
|
allowsDuplicates: false,
|
||||||
mapping: mapNotEmpty
|
mapping: mapNotEmpty
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -29,7 +29,9 @@ import NetworkExtension
|
||||||
extension Profile.OnDemand {
|
extension Profile.OnDemand {
|
||||||
func rules(withCustomRules: Bool) -> [NEOnDemandRule] {
|
func rules(withCustomRules: Bool) -> [NEOnDemandRule] {
|
||||||
|
|
||||||
// TODO: on-demand, drop when "trusted networks" -> "on-demand"
|
// TODO: on-demand, drop hardcoding when "trusted networks" -> "on-demand"
|
||||||
|
// isEnabled = true
|
||||||
|
// policy = .excluding
|
||||||
assert(policy == .excluding)
|
assert(policy == .excluding)
|
||||||
|
|
||||||
var rules: [NEOnDemandRule] = []
|
var rules: [NEOnDemandRule] = []
|
||||||
|
|
|
@ -97,13 +97,27 @@ extension OpenVPN.ConfigurationBuilder {
|
||||||
break
|
break
|
||||||
|
|
||||||
case .manual:
|
case .manual:
|
||||||
isDNSEnabled = settings.isDNSEnabled
|
let isDNSEnabled = settings.configurationType != .disabled
|
||||||
|
self.isDNSEnabled = isDNSEnabled
|
||||||
|
|
||||||
if settings.isDNSEnabled {
|
switch settings.configurationType {
|
||||||
dnsProtocol = settings.dnsProtocol
|
case .plain:
|
||||||
dnsServers = settings.dnsServers.filter { !$0.isEmpty }
|
dnsProtocol = .plain
|
||||||
|
|
||||||
|
case .https:
|
||||||
|
dnsProtocol = .https
|
||||||
dnsHTTPSURL = settings.dnsHTTPSURL
|
dnsHTTPSURL = settings.dnsHTTPSURL
|
||||||
|
|
||||||
|
case .tls:
|
||||||
|
dnsProtocol = .tls
|
||||||
dnsTLSServerName = settings.dnsTLSServerName
|
dnsTLSServerName = settings.dnsTLSServerName
|
||||||
|
|
||||||
|
case .disabled:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if isDNSEnabled {
|
||||||
|
dnsServers = settings.dnsServers?.filter { !$0.isEmpty }
|
||||||
searchDomains = settings.dnsSearchDomains
|
searchDomains = settings.dnsSearchDomains
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +135,7 @@ extension OpenVPN.ConfigurationBuilder {
|
||||||
case .manual:
|
case .manual:
|
||||||
httpProxy = settings.proxyServer
|
httpProxy = settings.proxyServer
|
||||||
httpsProxy = settings.proxyServer
|
httpsProxy = settings.proxyServer
|
||||||
proxyBypassDomains = settings.proxyBypassDomains.filter { !$0.isEmpty }
|
proxyBypassDomains = settings.proxyBypassDomains?.filter { !$0.isEmpty }
|
||||||
proxyAutoConfigurationURL = nil
|
proxyAutoConfigurationURL = nil
|
||||||
|
|
||||||
case .pac:
|
case .pac:
|
||||||
|
|
|
@ -89,12 +89,17 @@ extension WireGuard.ConfigurationBuilder {
|
||||||
break
|
break
|
||||||
|
|
||||||
case .manual:
|
case .manual:
|
||||||
if settings.isDNSEnabled {
|
switch settings.configurationType {
|
||||||
dnsServers = settings.dnsServers
|
case .plain:
|
||||||
dnsSearchDomains = settings.dnsSearchDomains.filter { !$0.isEmpty }
|
dnsServers = settings.dnsServers ?? []
|
||||||
} else {
|
dnsSearchDomains = settings.dnsSearchDomains?.filter { !$0.isEmpty } ?? []
|
||||||
|
|
||||||
|
case .disabled:
|
||||||
dnsServers = []
|
dnsServers = []
|
||||||
dnsSearchDomains = []
|
dnsSearchDomains = []
|
||||||
|
|
||||||
|
default:
|
||||||
|
fatalError("Invalid DNS configuration for WireGuard: \(settings.configurationType)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,7 +288,7 @@ extension AppManager {
|
||||||
|
|
||||||
// dns
|
// dns
|
||||||
(manual["dnsProtocol"] as? String).map {
|
(manual["dnsProtocol"] as? String).map {
|
||||||
settings.dns.dnsProtocol = DNSProtocol(rawValue: $0) ?? .plain
|
settings.dns.configurationType = .init(rawValue: $0) ?? .plain
|
||||||
}
|
}
|
||||||
settings.dns.dnsServers = manual["dnsServers"] as? [String] ?? []
|
settings.dns.dnsServers = manual["dnsServers"] as? [String] ?? []
|
||||||
settings.dns.dnsSearchDomains = manual["dnsSearchDomains"] as? [String] ?? []
|
settings.dns.dnsSearchDomains = manual["dnsSearchDomains"] as? [String] ?? []
|
||||||
|
|
|
@ -58,8 +58,6 @@ extension VPNManager {
|
||||||
withCustomRules: isOnDemandRulesSupported()
|
withCustomRules: isOnDemandRulesSupported()
|
||||||
)
|
)
|
||||||
|
|
||||||
var cfg: VPNConfiguration
|
|
||||||
|
|
||||||
switch profile.currentVPNProtocol {
|
switch profile.currentVPNProtocol {
|
||||||
case .openVPN:
|
case .openVPN:
|
||||||
let settings: Profile.OpenVPNSettings
|
let settings: Profile.OpenVPNSettings
|
||||||
|
@ -71,7 +69,7 @@ extension VPNManager {
|
||||||
}
|
}
|
||||||
settings = hostSettings
|
settings = hostSettings
|
||||||
}
|
}
|
||||||
cfg = try settings.vpnConfiguration(parameters)
|
return try settings.vpnConfiguration(parameters)
|
||||||
|
|
||||||
case .wireGuard:
|
case .wireGuard:
|
||||||
let settings: Profile.WireGuardSettings
|
let settings: Profile.WireGuardSettings
|
||||||
|
@ -83,10 +81,8 @@ extension VPNManager {
|
||||||
}
|
}
|
||||||
settings = hostSettings
|
settings = hostSettings
|
||||||
}
|
}
|
||||||
cfg = try settings.vpnConfiguration(parameters)
|
return try settings.vpnConfiguration(parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
return cfg
|
|
||||||
} catch {
|
} catch {
|
||||||
pp_log.error("Unable to build VPNConfiguration: \(error)")
|
pp_log.error("Unable to build VPNConfiguration: \(error)")
|
||||||
|
|
||||||
|
|
|
@ -51,21 +51,21 @@ public protocol GatewaySettingsProviding {
|
||||||
}
|
}
|
||||||
|
|
||||||
public protocol DNSSettingsProviding {
|
public protocol DNSSettingsProviding {
|
||||||
var dnsProtocol: DNSProtocol { get }
|
var dnsProtocol: DNSProtocol? { get }
|
||||||
|
|
||||||
var dnsServers: [String] { get }
|
var dnsServers: [String]? { get }
|
||||||
|
|
||||||
|
var dnsSearchDomains: [String]? { get }
|
||||||
|
|
||||||
var dnsHTTPSURL: URL? { get }
|
var dnsHTTPSURL: URL? { get }
|
||||||
|
|
||||||
var dnsTLSServerName: String? { get }
|
var dnsTLSServerName: String? { get }
|
||||||
|
|
||||||
var dnsSearchDomains: [String] { get }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public protocol ProxySettingsProviding {
|
public protocol ProxySettingsProviding {
|
||||||
var proxyServer: Proxy? { get }
|
var proxyServer: Proxy? { get }
|
||||||
|
|
||||||
var proxyBypassDomains: [String] { get }
|
var proxyBypassDomains: [String]? { get }
|
||||||
|
|
||||||
var proxyAutoConfigurationURL: URL? { get }
|
var proxyAutoConfigurationURL: URL? { get }
|
||||||
}
|
}
|
||||||
|
@ -88,15 +88,27 @@ extension Network {
|
||||||
|
|
||||||
extension Network {
|
extension Network {
|
||||||
public struct DNSSettings: Codable, Equatable, NetworkChoiceRepresentable, DNSSettingsProviding {
|
public struct DNSSettings: Codable, Equatable, NetworkChoiceRepresentable, DNSSettingsProviding {
|
||||||
|
public enum ConfigurationType: String, Codable {
|
||||||
|
case plain
|
||||||
|
|
||||||
|
case https
|
||||||
|
|
||||||
|
case tls
|
||||||
|
|
||||||
|
case disabled
|
||||||
|
}
|
||||||
|
|
||||||
public var choice: Network.Choice
|
public var choice: Network.Choice
|
||||||
|
|
||||||
public var isDNSEnabled = true
|
public var configurationType: ConfigurationType = .plain
|
||||||
|
|
||||||
public var dnsProtocol: DNSProtocol = .plain
|
public var dnsProtocol: DNSProtocol? {
|
||||||
|
DNSProtocol(rawValue: configurationType.rawValue)
|
||||||
|
}
|
||||||
|
|
||||||
public var dnsServers: [String] = []
|
public var dnsServers: [String]?
|
||||||
|
|
||||||
public var dnsSearchDomains: [String] = []
|
public var dnsSearchDomains: [String]?
|
||||||
|
|
||||||
public var dnsHTTPSURL: URL?
|
public var dnsHTTPSURL: URL?
|
||||||
|
|
||||||
|
@ -122,7 +134,7 @@ extension Network {
|
||||||
|
|
||||||
public var proxyPort: UInt16?
|
public var proxyPort: UInt16?
|
||||||
|
|
||||||
public var proxyBypassDomains: [String] = []
|
public var proxyBypassDomains: [String]?
|
||||||
|
|
||||||
public var proxyAutoConfigurationURL: URL?
|
public var proxyAutoConfigurationURL: URL?
|
||||||
|
|
||||||
|
|
|
@ -43,18 +43,18 @@ extension Profile.OpenVPNSettings: GatewaySettingsProviding {
|
||||||
extension Profile.OpenVPNSettings: DNSSettingsProviding {
|
extension Profile.OpenVPNSettings: DNSSettingsProviding {
|
||||||
|
|
||||||
// not a dhcp-option
|
// not a dhcp-option
|
||||||
public var dnsProtocol: DNSProtocol {
|
public var dnsProtocol: DNSProtocol? {
|
||||||
return .plain
|
return (configuration.isDNSEnabled ?? true) ? .plain : nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// dhcp-option DNS
|
// dhcp-option DNS
|
||||||
public var dnsServers: [String] {
|
public var dnsServers: [String]? {
|
||||||
return configuration.dnsServers ?? []
|
return configuration.dnsServers
|
||||||
}
|
}
|
||||||
|
|
||||||
// dhcp-option DOMAIN/DOMAIN-SEARCH
|
// dhcp-option DOMAIN/DOMAIN-SEARCH
|
||||||
public var dnsSearchDomains: [String] {
|
public var dnsSearchDomains: [String]? {
|
||||||
return configuration.searchDomains ?? []
|
return configuration.searchDomains
|
||||||
}
|
}
|
||||||
|
|
||||||
// not a dhcp-option
|
// not a dhcp-option
|
||||||
|
@ -75,15 +75,15 @@ extension Profile.OpenVPNSettings: ProxySettingsProviding {
|
||||||
return configuration.httpsProxy ?? configuration.httpProxy
|
return configuration.httpsProxy ?? configuration.httpProxy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dhcp-option PROXY_BYPASS
|
||||||
|
public var proxyBypassDomains: [String]? {
|
||||||
|
return configuration.proxyBypassDomains
|
||||||
|
}
|
||||||
|
|
||||||
// dhcp-option PROXY_AUTO_CONFIG_URL
|
// dhcp-option PROXY_AUTO_CONFIG_URL
|
||||||
public var proxyAutoConfigurationURL: URL? {
|
public var proxyAutoConfigurationURL: URL? {
|
||||||
return configuration.proxyAutoConfigurationURL
|
return configuration.proxyAutoConfigurationURL
|
||||||
}
|
}
|
||||||
|
|
||||||
// dhcp-option PROXY_BYPASS
|
|
||||||
public var proxyBypassDomains: [String] {
|
|
||||||
return configuration.proxyBypassDomains ?? []
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Profile.OpenVPNSettings: MTUSettingsProviding {
|
extension Profile.OpenVPNSettings: MTUSettingsProviding {
|
||||||
|
|
|
@ -51,11 +51,11 @@ extension Profile.OnDemand: StrippableContent {
|
||||||
extension Profile.NetworkSettings: StrippableContent {
|
extension Profile.NetworkSettings: StrippableContent {
|
||||||
public var stripped: Self {
|
public var stripped: Self {
|
||||||
var copy = self
|
var copy = self
|
||||||
copy.dns.dnsServers = copy.dns.dnsServers.compactMap(\.strippedNotEmpty)
|
copy.dns.dnsServers = copy.dns.dnsServers?.compactMap(\.strippedNotEmpty)
|
||||||
copy.dns.dnsSearchDomains = copy.dns.dnsSearchDomains.compactMap(\.strippedNotEmpty)
|
copy.dns.dnsSearchDomains = copy.dns.dnsSearchDomains?.compactMap(\.strippedNotEmpty)
|
||||||
copy.dns.dnsTLSServerName = copy.dns.dnsTLSServerName?.strippedNotEmpty
|
copy.dns.dnsTLSServerName = copy.dns.dnsTLSServerName?.strippedNotEmpty
|
||||||
copy.proxy.proxyAddress = copy.proxy.proxyAddress?.strippedNotEmpty
|
copy.proxy.proxyAddress = copy.proxy.proxyAddress?.strippedNotEmpty
|
||||||
copy.proxy.proxyBypassDomains = copy.proxy.proxyBypassDomains.compactMap(\.strippedNotEmpty)
|
copy.proxy.proxyBypassDomains = copy.proxy.proxyBypassDomains?.compactMap(\.strippedNotEmpty)
|
||||||
return copy
|
return copy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,15 +28,15 @@ import TunnelKitCore
|
||||||
import TunnelKitWireGuard
|
import TunnelKitWireGuard
|
||||||
|
|
||||||
extension Profile.WireGuardSettings: DNSSettingsProviding {
|
extension Profile.WireGuardSettings: DNSSettingsProviding {
|
||||||
public var dnsProtocol: DNSProtocol {
|
public var dnsProtocol: DNSProtocol? {
|
||||||
return .plain
|
return .plain
|
||||||
}
|
}
|
||||||
|
|
||||||
public var dnsServers: [String] {
|
public var dnsServers: [String]? {
|
||||||
return configuration.dnsServers
|
return configuration.dnsServers
|
||||||
}
|
}
|
||||||
|
|
||||||
public var dnsSearchDomains: [String] {
|
public var dnsSearchDomains: [String]? {
|
||||||
return configuration.dnsSearchDomains
|
return configuration.dnsSearchDomains
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,13 +28,13 @@ import TunnelKitCore
|
||||||
import PassepartoutProviders
|
import PassepartoutProviders
|
||||||
|
|
||||||
extension Network.DNSSettings {
|
extension Network.DNSSettings {
|
||||||
public static func availableProtocols(forVPNProtocol vpnProtocol: VPNProtocolType) -> [DNSProtocol] {
|
public static func availableConfigurationTypes(forVPNProtocol vpnProtocol: VPNProtocolType) -> [ConfigurationType] {
|
||||||
switch vpnProtocol {
|
switch vpnProtocol {
|
||||||
case .openVPN:
|
case .openVPN:
|
||||||
return [.plain, .https, .tls]
|
return [.plain, .https, .tls, .disabled]
|
||||||
|
|
||||||
case .wireGuard:
|
case .wireGuard:
|
||||||
return [.plain]
|
return [.plain, .disabled]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue