diff --git a/DNSecure.xcodeproj/project.pbxproj b/DNSecure.xcodeproj/project.pbxproj index 7c3c3e6..0f24fbe 100644 --- a/DNSecure.xcodeproj/project.pbxproj +++ b/DNSecure.xcodeproj/project.pbxproj @@ -3,34 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 70; objects = { /* Begin PBXBuildFile section */ - 890B80D5251DC3A20046BAA0 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890B80D4251DC3A20046BAA0 /* DetailView.swift */; }; - 890B80DF251DC6B50046BAA0 /* Presets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890B80DE251DC6B50046BAA0 /* Presets.swift */; }; - 893AA853258F99630060B022 /* NEOnDemandRuleInterfaceType+CaseIterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA852258F99630060B022 /* NEOnDemandRuleInterfaceType+CaseIterable.swift */; }; - 893AA858258F996F0060B022 /* NEOnDemandRuleInterfaceType+CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA857258F996F0060B022 /* NEOnDemandRuleInterfaceType+CustomStringConvertible.swift */; }; - 893AA85D258F997A0060B022 /* NEOnDemandRuleInterfaceType+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA85C258F997A0060B022 /* NEOnDemandRuleInterfaceType+Codable.swift */; }; - 893AA862258F998C0060B022 /* NEOnDemandRuleInterfaceType+isSSIDUsed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA861258F998C0060B022 /* NEOnDemandRuleInterfaceType+isSSIDUsed.swift */; }; - 893AA867258F99990060B022 /* NEOnDemandRuleAction+CaseIterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA866258F99990060B022 /* NEOnDemandRuleAction+CaseIterable.swift */; }; - 893AA86C258F99A10060B022 /* NEOnDemandRuleAction+CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA86B258F99A10060B022 /* NEOnDemandRuleAction+CustomStringConvertible.swift */; }; - 893AA871258F99AD0060B022 /* NEOnDemandRuleAction+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893AA870258F99AD0060B022 /* NEOnDemandRuleAction+Codable.swift */; }; - 8940023C24ACBD2700EBE74B /* DNSecureApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8940023B24ACBD2700EBE74B /* DNSecureApp.swift */; }; - 8940023E24ACBD2700EBE74B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8940023D24ACBD2700EBE74B /* ContentView.swift */; }; - 8940024024ACBD2800EBE74B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8940023F24ACBD2800EBE74B /* Assets.xcassets */; }; - 8940024324ACBD2800EBE74B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8940024224ACBD2800EBE74B /* Preview Assets.xcassets */; }; - 8940024E24ACBD2800EBE74B /* DNSecureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8940024D24ACBD2800EBE74B /* DNSecureTests.swift */; }; - 8940025924ACBD2800EBE74B /* DNSecureUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8940025824ACBD2800EBE74B /* DNSecureUITests.swift */; }; 8940026924ACBE4900EBE74B /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8940026824ACBE4900EBE74B /* NetworkExtension.framework */; }; - 894958AD2548405E009691D5 /* RuleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 894958AC2548405E009691D5 /* RuleView.swift */; }; - 894F33652C46D2F00060F385 /* RestorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 894F33642C46D2A20060F385 /* RestorationView.swift */; }; - 8963FDFB251DF1BC00E3DFE7 /* Bundle+displayName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8963FDFA251DF1BC00E3DFE7 /* Bundle+displayName.swift */; }; - 8986CDCF251D9B3400D947CD /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8986CDCE251D9B3400D947CD /* Resolver.swift */; }; - 8998041628DCDED800C8B421 /* DoTSections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8998041528DCDED800C8B421 /* DoTSections.swift */; }; - 8998041828DCDEEF00C8B421 /* DoHSections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8998041728DCDEEF00C8B421 /* DoHSections.swift */; }; - 89CB922125209DD100B6983C /* HowToActivateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89CB922025209DD100B6983C /* HowToActivateView.swift */; }; - 89E8B71A29F80164002C2AEF /* LazyTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E8B71929F80164002C2AEF /* LazyTextField.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -51,40 +28,29 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 890B80D4251DC3A20046BAA0 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; - 890B80DE251DC6B50046BAA0 /* Presets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Presets.swift; sourceTree = ""; }; 8924EDF324C9CDF1004AF871 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 893AA852258F99630060B022 /* NEOnDemandRuleInterfaceType+CaseIterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleInterfaceType+CaseIterable.swift"; sourceTree = ""; }; - 893AA857258F996F0060B022 /* NEOnDemandRuleInterfaceType+CustomStringConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleInterfaceType+CustomStringConvertible.swift"; sourceTree = ""; }; - 893AA85C258F997A0060B022 /* NEOnDemandRuleInterfaceType+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleInterfaceType+Codable.swift"; sourceTree = ""; }; - 893AA861258F998C0060B022 /* NEOnDemandRuleInterfaceType+isSSIDUsed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleInterfaceType+isSSIDUsed.swift"; sourceTree = ""; }; - 893AA866258F99990060B022 /* NEOnDemandRuleAction+CaseIterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleAction+CaseIterable.swift"; sourceTree = ""; }; - 893AA86B258F99A10060B022 /* NEOnDemandRuleAction+CustomStringConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleAction+CustomStringConvertible.swift"; sourceTree = ""; }; - 893AA870258F99AD0060B022 /* NEOnDemandRuleAction+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEOnDemandRuleAction+Codable.swift"; sourceTree = ""; }; 8940023824ACBD2700EBE74B /* DNSecure.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DNSecure.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8940023B24ACBD2700EBE74B /* DNSecureApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSecureApp.swift; sourceTree = ""; }; - 8940023D24ACBD2700EBE74B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 8940023F24ACBD2800EBE74B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 8940024224ACBD2800EBE74B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 8940024424ACBD2800EBE74B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8940024924ACBD2800EBE74B /* DNSecureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DNSecureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8940024D24ACBD2800EBE74B /* DNSecureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSecureTests.swift; sourceTree = ""; }; - 8940024F24ACBD2800EBE74B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8940025424ACBD2800EBE74B /* DNSecureUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DNSecureUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8940025824ACBD2800EBE74B /* DNSecureUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSecureUITests.swift; sourceTree = ""; }; - 8940025A24ACBD2800EBE74B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8940026624ACBE4900EBE74B /* DNSecure.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DNSecure.entitlements; sourceTree = ""; }; 8940026824ACBE4900EBE74B /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; - 894958AC2548405E009691D5 /* RuleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleView.swift; sourceTree = ""; }; - 894F33642C46D2A20060F385 /* RestorationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestorationView.swift; sourceTree = ""; }; - 8963FDFA251DF1BC00E3DFE7 /* Bundle+displayName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+displayName.swift"; sourceTree = ""; }; - 8986CDCE251D9B3400D947CD /* Resolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Resolver.swift; sourceTree = ""; }; - 8998041528DCDED800C8B421 /* DoTSections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoTSections.swift; sourceTree = ""; }; - 8998041728DCDEEF00C8B421 /* DoHSections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoHSections.swift; sourceTree = ""; }; - 89CB922025209DD100B6983C /* HowToActivateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowToActivateView.swift; sourceTree = ""; }; - 89E8B71929F80164002C2AEF /* LazyTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyTextField.swift; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 899AD03F2E66100500449710 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 8940023724ACBD2700EBE74B /* DNSecure */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 899AD0232E66100500449710 /* DNSecure */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (899AD03F2E66100500449710 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = DNSecure; sourceTree = ""; }; + 899AD0422E66100E00449710 /* DNSecureTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = DNSecureTests; sourceTree = ""; }; + 899AD0472E66101100449710 /* DNSecureUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = DNSecureUITests; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 8940023524ACBD2700EBE74B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; @@ -111,52 +77,13 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 893AA816258F790D0060B022 /* Views */ = { - isa = PBXGroup; - children = ( - 894F33642C46D2A20060F385 /* RestorationView.swift */, - 8940023D24ACBD2700EBE74B /* ContentView.swift */, - 89CB922025209DD100B6983C /* HowToActivateView.swift */, - 890B80D4251DC3A20046BAA0 /* DetailView.swift */, - 894958AC2548405E009691D5 /* RuleView.swift */, - 8998041528DCDED800C8B421 /* DoTSections.swift */, - 8998041728DCDEEF00C8B421 /* DoHSections.swift */, - 89E8B71929F80164002C2AEF /* LazyTextField.swift */, - ); - path = Views; - sourceTree = ""; - }; - 893AA817258F79F70060B022 /* Models */ = { - isa = PBXGroup; - children = ( - 8986CDCE251D9B3400D947CD /* Resolver.swift */, - 890B80DE251DC6B50046BAA0 /* Presets.swift */, - ); - path = Models; - sourceTree = ""; - }; - 893AA818258F7A0C0060B022 /* Extensions */ = { - isa = PBXGroup; - children = ( - 8963FDFA251DF1BC00E3DFE7 /* Bundle+displayName.swift */, - 893AA852258F99630060B022 /* NEOnDemandRuleInterfaceType+CaseIterable.swift */, - 893AA857258F996F0060B022 /* NEOnDemandRuleInterfaceType+CustomStringConvertible.swift */, - 893AA85C258F997A0060B022 /* NEOnDemandRuleInterfaceType+Codable.swift */, - 893AA861258F998C0060B022 /* NEOnDemandRuleInterfaceType+isSSIDUsed.swift */, - 893AA866258F99990060B022 /* NEOnDemandRuleAction+CaseIterable.swift */, - 893AA86B258F99A10060B022 /* NEOnDemandRuleAction+CustomStringConvertible.swift */, - 893AA870258F99AD0060B022 /* NEOnDemandRuleAction+Codable.swift */, - ); - path = Extensions; - sourceTree = ""; - }; 8940022F24ACBD2700EBE74B = { isa = PBXGroup; children = ( 8924EDF324C9CDF1004AF871 /* README.md */, - 8940023A24ACBD2700EBE74B /* DNSecure */, - 8940024C24ACBD2800EBE74B /* DNSecureTests */, - 8940025724ACBD2800EBE74B /* DNSecureUITests */, + 899AD0232E66100500449710 /* DNSecure */, + 899AD0422E66100E00449710 /* DNSecureTests */, + 899AD0472E66101100449710 /* DNSecureUITests */, 8940023924ACBD2700EBE74B /* Products */, 8940026724ACBE4900EBE74B /* Frameworks */, ); @@ -172,47 +99,6 @@ name = Products; sourceTree = ""; }; - 8940023A24ACBD2700EBE74B /* DNSecure */ = { - isa = PBXGroup; - children = ( - 8940026624ACBE4900EBE74B /* DNSecure.entitlements */, - 8940023B24ACBD2700EBE74B /* DNSecureApp.swift */, - 893AA816258F790D0060B022 /* Views */, - 893AA817258F79F70060B022 /* Models */, - 893AA818258F7A0C0060B022 /* Extensions */, - 8940023F24ACBD2800EBE74B /* Assets.xcassets */, - 8940024424ACBD2800EBE74B /* Info.plist */, - 8940024124ACBD2800EBE74B /* Preview Content */, - ); - path = DNSecure; - sourceTree = ""; - }; - 8940024124ACBD2800EBE74B /* Preview Content */ = { - isa = PBXGroup; - children = ( - 8940024224ACBD2800EBE74B /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 8940024C24ACBD2800EBE74B /* DNSecureTests */ = { - isa = PBXGroup; - children = ( - 8940024D24ACBD2800EBE74B /* DNSecureTests.swift */, - 8940024F24ACBD2800EBE74B /* Info.plist */, - ); - path = DNSecureTests; - sourceTree = ""; - }; - 8940025724ACBD2800EBE74B /* DNSecureUITests */ = { - isa = PBXGroup; - children = ( - 8940025824ACBD2800EBE74B /* DNSecureUITests.swift */, - 8940025A24ACBD2800EBE74B /* Info.plist */, - ); - path = DNSecureUITests; - sourceTree = ""; - }; 8940026724ACBE4900EBE74B /* Frameworks */ = { isa = PBXGroup; children = ( @@ -236,6 +122,9 @@ ); dependencies = ( ); + fileSystemSynchronizedGroups = ( + 899AD0232E66100500449710 /* DNSecure */, + ); name = DNSecure; productName = DNSecure; productReference = 8940023824ACBD2700EBE74B /* DNSecure.app */; @@ -254,6 +143,9 @@ dependencies = ( 8940024B24ACBD2800EBE74B /* PBXTargetDependency */, ); + fileSystemSynchronizedGroups = ( + 899AD0422E66100E00449710 /* DNSecureTests */, + ); name = DNSecureTests; productName = DNSecureTests; productReference = 8940024924ACBD2800EBE74B /* DNSecureTests.xctest */; @@ -272,6 +164,9 @@ dependencies = ( 8940025624ACBD2800EBE74B /* PBXTargetDependency */, ); + fileSystemSynchronizedGroups = ( + 899AD0472E66101100449710 /* DNSecureUITests */, + ); name = DNSecureUITests; productName = DNSecureUITests; productReference = 8940025424ACBD2800EBE74B /* DNSecureUITests.xctest */; @@ -325,8 +220,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8940024324ACBD2800EBE74B /* Preview Assets.xcassets in Resources */, - 8940024024ACBD2800EBE74B /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -351,25 +244,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8986CDCF251D9B3400D947CD /* Resolver.swift in Sources */, - 89CB922125209DD100B6983C /* HowToActivateView.swift in Sources */, - 890B80D5251DC3A20046BAA0 /* DetailView.swift in Sources */, - 893AA853258F99630060B022 /* NEOnDemandRuleInterfaceType+CaseIterable.swift in Sources */, - 893AA871258F99AD0060B022 /* NEOnDemandRuleAction+Codable.swift in Sources */, - 893AA85D258F997A0060B022 /* NEOnDemandRuleInterfaceType+Codable.swift in Sources */, - 894F33652C46D2F00060F385 /* RestorationView.swift in Sources */, - 8940023E24ACBD2700EBE74B /* ContentView.swift in Sources */, - 894958AD2548405E009691D5 /* RuleView.swift in Sources */, - 8998041828DCDEEF00C8B421 /* DoHSections.swift in Sources */, - 89E8B71A29F80164002C2AEF /* LazyTextField.swift in Sources */, - 890B80DF251DC6B50046BAA0 /* Presets.swift in Sources */, - 893AA858258F996F0060B022 /* NEOnDemandRuleInterfaceType+CustomStringConvertible.swift in Sources */, - 8940023C24ACBD2700EBE74B /* DNSecureApp.swift in Sources */, - 8998041628DCDED800C8B421 /* DoTSections.swift in Sources */, - 893AA862258F998C0060B022 /* NEOnDemandRuleInterfaceType+isSSIDUsed.swift in Sources */, - 893AA867258F99990060B022 /* NEOnDemandRuleAction+CaseIterable.swift in Sources */, - 893AA86C258F99A10060B022 /* NEOnDemandRuleAction+CustomStringConvertible.swift in Sources */, - 8963FDFB251DF1BC00E3DFE7 /* Bundle+displayName.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -377,7 +251,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8940024E24ACBD2800EBE74B /* DNSecureTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -385,7 +258,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8940025924ACBD2800EBE74B /* DNSecureUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/DNSecure/Views/ContentView.swift b/DNSecure/Views/ContentView.swift index 904d5a7..c1fce01 100644 --- a/DNSecure/Views/ContentView.swift +++ b/DNSecure/Views/ContentView.swift @@ -188,7 +188,9 @@ extension ContentView: View { if self.selection == -1 { HowToActivateView() } else if let i = self.selection { - self.detailView(at: i) + NavigationStack { + self.detailView(at: i) + } } else if !self.isEnabled { HowToActivateView() } else { diff --git a/DNSecure/Views/DNSSearchDomainMatchView.swift b/DNSecure/Views/DNSSearchDomainMatchView.swift new file mode 100644 index 0000000..12318da --- /dev/null +++ b/DNSecure/Views/DNSSearchDomainMatchView.swift @@ -0,0 +1,46 @@ +import NetworkExtension +import SwiftUI + +struct DNSSearchDomainMatchView { + @Binding var rule: OnDemandRule +} + +extension DNSSearchDomainMatchView: View { + var body: some View { + Form { + Section { + ForEach(0.. { + .init( + get: { self.rule.probeURL?.absoluteString ?? "" }, + set: { self.rule.probeURL = URL(string: $0) } + ) + } +} + +extension ProbeURLView: View { + var body: some View { + Form { + Section { + LazyTextField("Probe URL", text: self.probeURL) + } footer: { + Text( + "If a request sent to this URL results in a HTTP 200 OK response and all of the other conditions in the rule match, then the rule matches. If you don't want to use this rule, leave it empty." + ) + } + } + .navigationTitle("Probe URL") + } +} + +@available(iOS 17, *) +#Preview { + @Previewable @State var rule = OnDemandRule(name: "Preview Rule") + NavigationStack { + ProbeURLView(rule: $rule) + } +} diff --git a/DNSecure/Views/RuleView.swift b/DNSecure/Views/RuleView.swift index 65e8fb7..72dbe7d 100644 --- a/DNSecure/Views/RuleView.swift +++ b/DNSecure/Views/RuleView.swift @@ -12,6 +12,7 @@ struct RuleView { @Binding var rule: OnDemandRule } +@MainActor extension RuleView: View { var body: some View { Form { @@ -19,6 +20,40 @@ extension RuleView: View { LazyTextField("Name", text: self.$rule.name) } + Section("Matching Conditions") { + NavigationLink { + InterfaceTypeMatchView(rule: self.$rule) + } label: { + self.interfaceTypeMatchLabel + } + + if self.rule.interfaceType.isSSIDUsed { + NavigationLink { + SSIDMatchView(rule: self.$rule) + } label: { + self.ssidMatchLabel + } + } + + NavigationLink { + DNSSearchDomainMatchView(rule: self.$rule) + } label: { + self.dnsSearchDomainMatchLabel + } + + NavigationLink { + DNSServerAddressMatchView(rule: self.$rule) + } label: { + self.dnsServerAddressMatchLabel + } + + NavigationLink { + ProbeURLView(rule: self.$rule) + } label: { + self.probeURLLabel + } + } + Section { Picker("Action", selection: self.$rule.action) { ForEach(NEOnDemandRuleAction.allCases, id: \.self) { @@ -26,129 +61,128 @@ extension RuleView: View { } } } - - Section { - Picker("Interface Type", selection: self.$rule.interfaceType) { - ForEach(NEOnDemandRuleInterfaceType.allCases, id: \.self) { - Text($0.description) - } - } - } header: { - Text("Interface Type Match") - } footer: { - Text( - "If the current primary network interface is of this type and all of the other conditions in the rule match, then the rule matches." - ) - } - - if self.rule.interfaceType.isSSIDUsed { - Section { - ForEach(0..