Compare commits

..

No commits in common. "603a23a1a8a3a969b607e48db1bf8bd99bdfb5b8" and "a6f8add14a70aafb67c1c758dfd201490341fe45" have entirely different histories.

6 changed files with 30 additions and 123 deletions

View file

@ -269,7 +269,7 @@
INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@ -305,7 +305,7 @@
INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",

View file

@ -6,7 +6,6 @@
// //
import Foundation import Foundation
import NetworkExtension
enum BlocklistOption: String, CaseIterable, Identifiable { enum BlocklistOption: String, CaseIterable, Identifiable {
case secure = "Secure" case secure = "Secure"
@ -67,12 +66,4 @@ enum BlocklistOption: String, CaseIterable, Identifiable {
return "2001:db8::1" return "2001:db8::1"
} }
} }
var settings: NEDNSOverHTTPSSettings {
let settings = NEDNSOverHTTPSSettings(servers: [ipv4, ipv6])
settings.serverURL = URL(string: "https://\(server)/dns-query")
settings.matchDomains = [""]
return settings
}
} }

View file

@ -48,7 +48,7 @@ struct HomeView: View {
private let privacyPolicyURL = URL(string: "https://www.sr2.uk/privacy")! private let privacyPolicyURL = URL(string: "https://www.sr2.uk/privacy")!
var body: some View { var body: some View {
NavigationCompat { NavigationStack {
List { List {
// Main toggle section // Main toggle section

View file

@ -1,32 +0,0 @@
//
// NavigationCompat.swift
// dns
//
// Created by Benjamin Erhart on 15.04.26.
//
import SwiftUI
struct NavigationCompat<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
if #available(iOS 16.0, macOS 13.0, *) {
NavigationStack {
content()
}
}
else {
NavigationView {
content()
}
#if !os(macOS)
.navigationViewStyle(StackNavigationViewStyle())
#endif
}
}
}

View file

@ -1,24 +0,0 @@
//
// Settings.swift
// dns
//
// Created by Benjamin Erhart on 15.04.26.
//
import Foundation
class Settings {
private static let blocklistKey = "blocklist"
private static let defaults = UserDefaults.standard
class var blocklist: BlocklistOption {
get {
BlocklistOption(rawValue: defaults.string(forKey: blocklistKey) ?? BlocklistOption.secure.rawValue) ?? .secure
}
set {
defaults.set(newValue.rawValue, forKey: blocklistKey)
}
}
}

View file

@ -12,24 +12,21 @@ import OSLog
class ViewModel: NSObject, ObservableObject { class ViewModel: NSObject, ObservableObject {
// TODO: Store this in UserDefaults
@Published @Published
var blocklist: BlocklistOption = .secure { var blocklist: BlocklistOption = .secure
didSet {
Settings.blocklist = blocklist
if isDnsEnabled {
toggleDns()
}
else {
isProgrammaticChange = false
}
}
}
// TODO: Store this in UserDefaults
@Published @Published
var isDnsEnabled = false { var isDnsEnabled = false {
didSet { didSet {
toggleDns() if !isProgrammaticChange {
toggleDns()
}
else {
// Reset, so next one is recognized as coming from the user again.
isProgrammaticChange = false
}
} }
} }
@ -41,51 +38,26 @@ class ViewModel: NSObject, ObservableObject {
private let log = Logger(subsystem: String(describing: ViewModel.self), category: String(describing: ViewModel.self)) private let log = Logger(subsystem: String(describing: ViewModel.self), category: String(describing: ViewModel.self))
override init() {
super.init()
isProgrammaticChange = true
blocklist = Settings.blocklist
Task {
do {
try await manager.loadFromPreferences()
}
catch {
log.error("Error loading preferences: \(error)")
return
}
if let settings = manager.dnsSettings {
for dnsServer in BlocklistOption.allCases {
if settings.servers.contains(dnsServer.ipv4) {
await MainActor.run {
isProgrammaticChange = true
blocklist = dnsServer
isProgrammaticChange = true
isDnsEnabled = true
}
break
}
}
}
}
}
func toggleDns() { func toggleDns() {
guard !isProgrammaticChange else {
// Reset, so next one is recognized as coming from the user again.
isProgrammaticChange = false
return
}
Task { Task {
if isDnsEnabled { if isDnsEnabled {
manager.dnsSettings = blocklist.settings do {
try await manager.loadFromPreferences()
}
catch {
log.error("Error loading preferences: \(error)")
delayedToggle(false)
return
}
let settings = NEDNSOverHTTPSSettings(servers: [blocklist.ipv4, blocklist.ipv6])
settings.serverURL = URL(string: "https://\(blocklist.server)")
settings.matchDomains = [""]
manager.dnsSettings = settings
manager.localizedDescription = blocklist.description manager.localizedDescription = blocklist.description
do { do {