From 37425a2e55c1ef08d40abbfc32d160ae0b8f9d05 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:39:49 +0100 Subject: [PATCH] idk maybe i've added DNS services? Yeah it should --- Sora/Utils/Extensions/URLSession.swift | 63 ++++++++++++++++--- .../Modules/ModuleAdditionSettingsView.swift | 2 +- Sora/Utils/Modules/ModuleManager.swift | 8 +-- .../SettingsViewGeneral.swift | 19 +++++- 4 files changed, 77 insertions(+), 15 deletions(-) diff --git a/Sora/Utils/Extensions/URLSession.swift b/Sora/Utils/Extensions/URLSession.swift index 9144c9f..d51eb38 100644 --- a/Sora/Utils/Extensions/URLSession.swift +++ b/Sora/Utils/Extensions/URLSession.swift @@ -5,10 +5,55 @@ // Created by Francesco on 05/01/25. // -import Foundation import Network +import Foundation + +enum DNSProvider: String, CaseIterable, Hashable { + case cloudflare = "Cloudflare" + case google = "Google" + case openDNS = "OpenDNS" + case quad9 = "Quad9" + case adGuard = "AdGuard" + case cleanbrowsing = "CleanBrowsing" + case controld = "ControlD" + + var servers: [String] { + switch self { + case .cloudflare: + return ["1.1.1.1", "1.0.0.1"] + case .google: + return ["8.8.8.8", "8.8.4.4"] + case .openDNS: + return ["208.67.222.222", "208.67.220.220"] + case .quad9: + return ["9.9.9.9", "149.112.112.112"] + case .adGuard: + return ["94.140.14.14", "94.140.15.15"] + case .cleanbrowsing: + return ["185.228.168.168", "185.228.169.168"] + case .controld: + return ["76.76.2.0", "76.76.10.0"] + } + } +} extension URLSession { + private static let dnsSelectorKey = "CustomDNSProvider" + + static var currentDNSProvider: DNSProvider { + get { + guard let savedProviderRawValue = UserDefaults.standard.string(forKey: dnsSelectorKey) else { + UserDefaults.standard.set(DNSProvider.cloudflare.rawValue, forKey: dnsSelectorKey) + return .cloudflare + } + + return DNSProvider(rawValue: savedProviderRawValue) ?? .cloudflare + } + set { + UserDefaults.standard.set(newValue.rawValue, forKey: dnsSelectorKey) + } + } + static let userAgents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", @@ -35,31 +80,33 @@ extension URLSession { "Mozilla/5.0 (Android 13; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0" ] - static let randomUserAgent: String = { + static var randomUserAgent: String { userAgents.randomElement() ?? userAgents[0] - }() + } - static let custom: URLSession = { + static var custom: URLSession { let configuration = URLSessionConfiguration.default configuration.httpAdditionalHeaders = [ "User-Agent": randomUserAgent ] return URLSession(configuration: configuration) - }() + } - static let cloudflareCustom: URLSession = { + static var cloudflareCustom: URLSession { let configuration = URLSessionConfiguration.default configuration.httpAdditionalHeaders = [ "User-Agent": randomUserAgent ] + let dnsServers = currentDNSProvider.servers + let dnsSettings: [AnyHashable: Any] = [ "DNSSettings": [ - "ServerAddresses": ["1.1.1.1", "1.0.0.1"] + "ServerAddresses": dnsServers ] ] configuration.connectionProxyDictionary = dnsSettings return URLSession(configuration: configuration) - }() + } } diff --git a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift index b2580e2..143cd94 100644 --- a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift +++ b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift @@ -154,7 +154,7 @@ struct ModuleAdditionSettingsView: View { return } do { - let (data, _) = try await URLSession.custom.data(from: url) + let (data, _) = try await URLSession.cloudflareCustom.data(from: url) let metadata = try JSONDecoder().decode(ModuleMetadata.self, from: data) await MainActor.run { self.moduleMetadata = metadata diff --git a/Sora/Utils/Modules/ModuleManager.swift b/Sora/Utils/Modules/ModuleManager.swift index d13d8cf..ada264c 100644 --- a/Sora/Utils/Modules/ModuleManager.swift +++ b/Sora/Utils/Modules/ModuleManager.swift @@ -46,14 +46,14 @@ class ModuleManager: ObservableObject { throw NSError(domain: "Module already exists", code: -1) } - let (metadataData, _) = try await URLSession.custom.data(from: url) + let (metadataData, _) = try await URLSession.cloudflareCustom.data(from: url) let metadata = try JSONDecoder().decode(ModuleMetadata.self, from: metadataData) guard let scriptUrl = URL(string: metadata.scriptUrl) else { throw NSError(domain: "Invalid script URL", code: -1) } - let (scriptData, _) = try await URLSession.custom.data(from: scriptUrl) + let (scriptData, _) = try await URLSession.cloudflareCustom.data(from: scriptUrl) guard let jsContent = String(data: scriptData, encoding: .utf8) else { throw NSError(domain: "Invalid script encoding", code: -1) } @@ -94,7 +94,7 @@ class ModuleManager: ObservableObject { func refreshModules() async { for (index, module) in modules.enumerated() { do { - let (metadataData, _) = try await URLSession.custom.data(from: URL(string: module.metadataUrl)!) + let (metadataData, _) = try await URLSession.cloudflareCustom.data(from: URL(string: module.metadataUrl)!) let newMetadata = try JSONDecoder().decode(ModuleMetadata.self, from: metadataData) if newMetadata.version != module.metadata.version { @@ -102,7 +102,7 @@ class ModuleManager: ObservableObject { throw NSError(domain: "Invalid script URL", code: -1) } - let (scriptData, _) = try await URLSession.custom.data(from: scriptUrl) + let (scriptData, _) = try await URLSession.cloudflareCustom.data(from: scriptUrl) guard let jsContent = String(data: scriptData, encoding: .utf8) else { throw NSError(domain: "Invalid script encoding", code: -1) } diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift index ed0f83e..310e5f3 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift @@ -14,9 +14,11 @@ struct SettingsViewGeneral: View { @AppStorage("analyticsEnabled") private var analyticsEnabled: Bool = false @AppStorage("multiThreads") private var multiThreadsEnabled: Bool = false @AppStorage("metadataProviders") private var metadataProviders: String = "AniList" + @AppStorage("CustomDNSProvider") private var customDNSProvider: String = "Cloudflare" @AppStorage("mediaColumnsPortrait") private var mediaColumnsPortrait: Int = 2 @AppStorage("mediaColumnsLandscape") private var mediaColumnsLandscape: Int = 4 + private let customDNSProviderList = ["Cloudflare", "Google", "OpenDNS", "Quad9", "AdGuard", "CleanBrowsing", "ControlD"] private let metadataProvidersList = ["AniList"] @EnvironmentObject var settings: Settings @@ -70,7 +72,6 @@ struct SettingsViewGeneral: View { } } } - } } @@ -121,9 +122,23 @@ struct SettingsViewGeneral: View { .tint(.accentColor) } - Section(header: Text("Analytics"), footer: Text("Allow Sora to collect anonymous data to improve the app. No personal information is collected. This can be disabled at any time.\n\n Information collected: \n- App version\n- Device model\n- Module Name/Version\n- Error Messages\n- Title of Watched Content")) { + Section(header: Text("Advanced"), footer: Text("Thanks to this Sora to collect anonymous data to improve the app. No personal information is collected. This can be disabled at any time.\n\n Information collected: \n- App version\n- Device model\n- Module Name/Version\n- Error Messages\n- Title of Watched Content")) { Toggle("Enable Analytics", isOn: $analyticsEnabled) .tint(.accentColor) + + HStack { + Text("DNS service") + Spacer() + Menu(customDNSProvider) { + ForEach(customDNSProviderList, id: \.self) { provider in + Button(action: { + customDNSProvider = provider + }) { + Text(provider) + } + } + } + } } } .navigationTitle("General")