From 63b1b20f5af6fa81c420ffb3ea6fc721f08c027b Mon Sep 17 00:00:00 2001 From: cranci1 <100066266+cranci1@users.noreply.github.com> Date: Sat, 14 Jun 2025 10:18:43 +0200 Subject: [PATCH] maybe DNS --- Sora/Utils/Extensions/URLSession.swift | 3 +- .../NetworkConfig/DNSConfiguration.swift | 47 +++++++ .../SettingsSubViews/SettingsViewDNS.swift | 116 ++++++++++++++++++ Sora/Views/SettingsView/SettingsView.swift | 5 + Sulfur.xcodeproj/project.pbxproj | 16 +++ 5 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 Sora/Utils/NetworkConfig/DNSConfiguration.swift create mode 100644 Sora/Views/SettingsView/SettingsSubViews/SettingsViewDNS.swift diff --git a/Sora/Utils/Extensions/URLSession.swift b/Sora/Utils/Extensions/URLSession.swift index d1cacb7..7fae451 100644 --- a/Sora/Utils/Extensions/URLSession.swift +++ b/Sora/Utils/Extensions/URLSession.swift @@ -60,7 +60,8 @@ extension URLSession { static let custom: URLSession = { let configuration = URLSessionConfiguration.default configuration.httpAdditionalHeaders = ["User-Agent": randomUserAgent] - return URLSession(configuration: configuration) + let session = URLSession(configuration: configuration) + return DNSConfiguration.shared.configureDNS(for: session) }() static func fetchData(allowRedirects:Bool) -> URLSession diff --git a/Sora/Utils/NetworkConfig/DNSConfiguration.swift b/Sora/Utils/NetworkConfig/DNSConfiguration.swift new file mode 100644 index 0000000..f38dd38 --- /dev/null +++ b/Sora/Utils/NetworkConfig/DNSConfiguration.swift @@ -0,0 +1,47 @@ +// +// DNSConfiguration.swift +// Sulfur +// +// Created by Francesco on 14/06/25. +// + +import Network +import Foundation + +enum DNSServer: String, CaseIterable { + case cloudflare = "1.1.1.1" + case cloudflareSecondary = "1.0.0.1" + case adGuard = "94.140.14.14" + case adGuardSecondary = "94.140.15.15" + case google = "8.8.8.8" + case googleSecondary = "8.8.4.4" + + static var current: [DNSServer] = [.cloudflare, .cloudflareSecondary] +} + +class DNSConfiguration { + static let shared = DNSConfiguration() + + private init() {} + + func configureDNS(for session: URLSession) -> URLSession { + let configuration = (session.configuration.copy() as! URLSessionConfiguration) + + let proxyDict: [AnyHashable: Any] = [ + kCFProxyTypeKey: kCFProxyTypeHTTPS, + kCFProxyHostNameKey: DNSServer.current[0].rawValue, + kCFProxyPortNumberKey: 443, + kCFProxyUsernameKey: "", + kCFProxyPasswordKey: "" + ] + + configuration.connectionProxyDictionary = proxyDict + + return URLSession(configuration: configuration, delegate: session.delegate, delegateQueue: session.delegateQueue) + } + + func setDNSServer(_ servers: [DNSServer]) { + DNSServer.current = servers + URLSession.shared.invalidateAndCancel() + } +} diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDNS.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDNS.swift new file mode 100644 index 0000000..8d3e545 --- /dev/null +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDNS.swift @@ -0,0 +1,116 @@ +// +// SettingsViewDNS.swift +// Sulfur +// +// Created by Francesco on 14/06/25. +// + +import SwiftUI + +fileprivate struct SettingsSection: View { + let title: String + let footer: String? + let content: Content + + init(title: String, footer: String? = nil, @ViewBuilder content: () -> Content) { + self.title = title + self.footer = footer + self.content = content() + } + + var body: some View { + VStack(alignment: .leading, spacing: 4) { + Text(title.uppercased()) + .font(.footnote) + .foregroundStyle(.gray) + .padding(.horizontal, 20) + + VStack(spacing: 0) { + content + } + .background(.ultraThinMaterial) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .overlay( + RoundedRectangle(cornerRadius: 12) + .strokeBorder( + LinearGradient( + gradient: Gradient(stops: [ + .init(color: Color.accentColor.opacity(0.3), location: 0), + .init(color: Color.accentColor.opacity(0), location: 1) + ]), + startPoint: .top, + endPoint: .bottom + ), + lineWidth: 0.5 + ) + ) + .padding(.horizontal, 20) + + if let footer = footer { + Text(footer) + .font(.footnote) + .foregroundStyle(.gray) + .padding(.horizontal, 20) + .padding(.top, 4) + } + } + } +} + +struct SettingsViewDNS: View { + @State private var selectedDNS: [DNSServer] = DNSServer.current + + var body: some View { + List { + SettingsSection(title: "DNS Server") { + ForEach(DNSServer.allCases.filter { $0.rawValue.hasSuffix(".14") || $0.rawValue.hasSuffix(".1") || $0.rawValue.hasSuffix(".8") }, id: \.self) { server in + Button(action: { + if let index = selectedDNS.firstIndex(of: server) { + selectedDNS.remove(at: index) + } else { + selectedDNS = [server] + if server == .cloudflare { + selectedDNS.append(.cloudflareSecondary) + } else if server == .adGuard { + selectedDNS.append(.adGuardSecondary) + } else if server == .google { + selectedDNS.append(.googleSecondary) + } + } + DNSConfiguration.shared.setDNSServer(selectedDNS) + }) { + HStack { + VStack(alignment: .leading) { + Text(server.rawValue) + Text(serverDescription(server)) + .font(.caption) + .foregroundColor(.gray) + } + Spacer() + if selectedDNS.contains(server) { + Image(systemName: "checkmark") + .foregroundColor(.accentColor) + } + } + } + } + } + + Section(footer: Text("Using custom DNS servers can help protect your privacy and potentially block ads. Changes take effect immediately.")) {} + } + .navigationTitle("DNS Settings") + } + + private func serverDescription(_ server: DNSServer) -> String { + switch server { + case .cloudflare: + return "Cloudflare (Fast & Private)" + case .adGuard: + return "AdGuard (Ad Blocking)" + case .google: + return "Google (Reliable)" + default: + return "" + } + } +} diff --git a/Sora/Views/SettingsView/SettingsView.swift b/Sora/Views/SettingsView/SettingsView.swift index 51f191c..fc82df3 100644 --- a/Sora/Views/SettingsView/SettingsView.swift +++ b/Sora/Views/SettingsView/SettingsView.swift @@ -216,6 +216,11 @@ struct SettingsView: View { NavigationLink(destination: SettingsViewLogger()) { SettingsNavigationRow(icon: "doc.text", titleKey: "Logs") } + Divider().padding(.horizontal, 16) + + NavigationLink(destination: SettingsViewDNS()) { + SettingsNavigationRow(icon: "server.rack", titleKey: "DNS") + } } .background(.ultraThinMaterial) .clipShape(RoundedRectangle(cornerRadius: 12)) diff --git a/Sulfur.xcodeproj/project.pbxproj b/Sulfur.xcodeproj/project.pbxproj index ba5a9f6..1677644 100644 --- a/Sulfur.xcodeproj/project.pbxproj +++ b/Sulfur.xcodeproj/project.pbxproj @@ -50,6 +50,8 @@ 133D7C932D2BE2640075467E /* Modules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C892D2BE2640075467E /* Modules.swift */; }; 133D7C942D2BE2640075467E /* JSController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C8B2D2BE2640075467E /* JSController.swift */; }; 133F55BB2D33B55100E08EEA /* LibraryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133F55BA2D33B55100E08EEA /* LibraryManager.swift */; }; + 134ECCA42DFD649D00372FCE /* DNSConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 134ECCA32DFD649D00372FCE /* DNSConfiguration.swift */; }; + 134ECCA82DFD655700372FCE /* SettingsViewDNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 134ECCA72DFD655700372FCE /* SettingsViewDNS.swift */; }; 1359ED142D76F49900C13034 /* finTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1359ED132D76F49900C13034 /* finTopView.swift */; }; 135CCBE22D4D1138008B9C0E /* SettingsViewPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135CCBE12D4D1138008B9C0E /* SettingsViewPlayer.swift */; }; 13637B8A2DE0EA1100BDA2FC /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13637B892DE0EA1100BDA2FC /* UserDefaults.swift */; }; @@ -145,6 +147,8 @@ 133D7C892D2BE2640075467E /* Modules.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Modules.swift; sourceTree = ""; }; 133D7C8B2D2BE2640075467E /* JSController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSController.swift; sourceTree = ""; }; 133F55BA2D33B55100E08EEA /* LibraryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryManager.swift; sourceTree = ""; }; + 134ECCA32DFD649D00372FCE /* DNSConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DNSConfiguration.swift; sourceTree = ""; }; + 134ECCA72DFD655700372FCE /* SettingsViewDNS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewDNS.swift; sourceTree = ""; }; 1359ED132D76F49900C13034 /* finTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = finTopView.swift; sourceTree = ""; }; 135CCBE12D4D1138008B9C0E /* SettingsViewPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewPlayer.swift; sourceTree = ""; }; 13637B892DE0EA1100BDA2FC /* UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = ""; }; @@ -378,6 +382,7 @@ 133D7C832D2BE2630075467E /* SettingsSubViews */ = { isa = PBXGroup; children = ( + 134ECCA72DFD655700372FCE /* SettingsViewDNS.swift */, 1E9FF1D22D403E42008AC100 /* SettingsViewLoggerFilter.swift */, 1399FAD32D3AB38C00E97C31 /* SettingsViewLogger.swift */, 133D7C842D2BE2630075467E /* SettingsViewModule.swift */, @@ -394,6 +399,7 @@ 133D7C852D2BE2640075467E /* Utils */ = { isa = PBXGroup; children = ( + 134ECCA22DFD649D00372FCE /* NetworkConfig */, 130326B42DF979A300AEF610 /* WebAuthentication */, 0457C5962DE7712A000AFBD9 /* ViewModifiers */, 04F08EE02DE10C22006B29D9 /* Models */, @@ -475,6 +481,14 @@ path = Downloads; sourceTree = ""; }; + 134ECCA22DFD649D00372FCE /* NetworkConfig */ = { + isa = PBXGroup; + children = ( + 134ECCA32DFD649D00372FCE /* DNSConfiguration.swift */, + ); + path = NetworkConfig; + sourceTree = ""; + }; 1384DCDF2D89BE870094797A /* Helpers */ = { isa = PBXGroup; children = ( @@ -770,6 +784,7 @@ 133F55BB2D33B55100E08EEA /* LibraryManager.swift in Sources */, 13E62FC42DABC58C0007E259 /* Trakt-Token.swift in Sources */, 1398FB3F2DE4E161004D3F5F /* SettingsViewAbout.swift in Sources */, + 134ECCA82DFD655700372FCE /* SettingsViewDNS.swift in Sources */, 133D7C8E2D2BE2640075467E /* LibraryView.swift in Sources */, 13E62FC72DABFE900007E259 /* TraktPushUpdates.swift in Sources */, 133D7C6E2D2BE2500075467E /* SoraApp.swift in Sources */, @@ -791,6 +806,7 @@ 7222485F2DCBAA2C00CABE2D /* DownloadModels.swift in Sources */, 722248602DCBAA2C00CABE2D /* M3U8StreamExtractor.swift in Sources */, 13C0E5EA2D5F85EA00E7F619 /* ContinueWatchingManager.swift in Sources */, + 134ECCA42DFD649D00372FCE /* DNSConfiguration.swift in Sources */, 13637B8A2DE0EA1100BDA2FC /* UserDefaults.swift in Sources */, 0457C59D2DE78267000AFBD9 /* BookmarkGridView.swift in Sources */, 0457C59E2DE78267000AFBD9 /* BookmarkLink.swift in Sources */,