From c60f7f18fb8217381587f1940d8e6effebff2a2a Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 1 Nov 2022 18:25:42 +0000 Subject: [PATCH] Update iOS app --- README.md | 6 +- .../ConfigurationProxy.swift | 220 ------------ .../CrossPlatformAppDelegate.swift | 151 -------- .../PacketTunnelProvider.swift | 37 +- .../Application/NSNotification.swift | 2 +- .../YggdrasilNetwork.imageset/Contents.json | 41 ++- .../YggdrasilNetwork.imageset/img1w.png | Bin 0 -> 17829 bytes .../YggdrasilNetwork.imageset/img2w.png | Bin 0 -> 38935 bytes .../YggdrasilNetwork.imageset/img3w.png | Bin 0 -> 62710 bytes .../Base.lproj/LaunchScreen.storyboard | 27 +- .../Storyboards/Base.lproj/Main.storyboard | 338 ++++++++---------- .../PeersViewController.swift | 68 ++-- .../SettingsViewController.swift | 32 +- .../SplitViewController.swift | 11 +- .../TableViewController.swift | 18 +- Yggdrasil Network.xcodeproj/project.pbxproj | 82 ++--- .../xcschemes/YggdrasilNetwork.xcscheme | 2 +- .../YggdrasilNetworkExtension.xcscheme | 2 +- YggdrasilNetwork.entitlements | 4 + YggdrasilNetworkExtension.entitlements | 6 + 20 files changed, 328 insertions(+), 719 deletions(-) delete mode 100644 Yggdrasil Network Cross-Platform/ConfigurationProxy.swift delete mode 100644 Yggdrasil Network Cross-Platform/CrossPlatformAppDelegate.swift create mode 100644 Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img1w.png create mode 100644 Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img2w.png create mode 100644 Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img3w.png diff --git a/README.md b/README.md index 8ffa88f..71e4f99 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,7 @@ Requires an Apple Developer account for the App Groups and Network Extension entitlements. -You will need to provision an app group and update bundle IDs throughout the Xcode project as appropriate. You can find them all by asking `git`: - -``` -git grep "eu.neilalexander.yggdrasil" -``` +You will need to provision an app group and update bundle IDs throughout the Xcode project as appropriate. To build, install Go 1.13 or later, and then install `gomobile`: diff --git a/Yggdrasil Network Cross-Platform/ConfigurationProxy.swift b/Yggdrasil Network Cross-Platform/ConfigurationProxy.swift deleted file mode 100644 index 6c02443..0000000 --- a/Yggdrasil Network Cross-Platform/ConfigurationProxy.swift +++ /dev/null @@ -1,220 +0,0 @@ -// -// ConfigurationProxy.swift -// YggdrasilNetwork -// -// Created by Neil Alexander on 07/01/2019. -// - -#if canImport(UIKit) -import UIKit -#elseif canImport(AppKit) -import AppKit -#endif -import Yggdrasil -import NetworkExtension - -#if os(iOS) -class PlatformItemSource: NSObject, UIActivityItemSource { - func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { - return "yggdrasil.conf" - } - - func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { - return nil - } -} -#elseif os(OSX) -class PlatformItemSource: NSObject {} -#endif - -class ConfigurationProxy: PlatformItemSource { - - private var json: Data? = nil - private var dict: [String: Any]? = nil - - override init() { - super.init() - self.json = MobileGenerateConfigJSON() - do { - try self.convertToDict() - } catch { - NSLog("ConfigurationProxy: Error deserialising JSON (\(error))") - } - #if os(iOS) - self.set("name", inSection: "NodeInfo", to: UIDevice.current.name) - #elseif os(OSX) - self.set("name", inSection: "NodeInfo", to: Host.current().localizedName ?? "") - #endif - self.set("MulticastInterfaces", to: ["en*"] as [String]) - self.set("AllowFromDirect", inSection: "SessionFirewall", to: true) - self.set("AllowFromRemote", inSection: "SessionFirewall", to: false) - self.set("AlwaysAllowOutbound", inSection: "SessionFirewall", to: true) - self.set("Enable", inSection: "SessionFirewall", to: true) - } - - init(json: Data) throws { - super.init() - self.json = json - try self.convertToDict() - } - - private func fix() { - self.set("Listen", to: [] as [String]) - self.set("AdminListen", to: "none") - self.set("IfName", to: "dummy") - self.set("Enable", inSection: "SessionFirewall", to: true) - self.set("MaxTotalQueueSize", inSection: "SwitchOptions", to: 1048576) - - if self.get("AutoStart") == nil { - self.set("AutoStart", to: ["WiFi": false, "Mobile": false] as [String: Bool]) - } - let interfaces = self.get("MulticastInterfaces") as? [String] ?? [] - if interfaces.contains(where: { $0 == "lo0" }) { - self.add("lo0", in: "MulticastInterfaces") - } - } - - func get(_ key: String) -> Any? { - if let dict = self.dict { - if dict.keys.contains(key) { - return dict[key] - } - } - return nil - } - - func get(_ key: String, inSection section: String) -> Any? { - if let dict = self.get(section) as? [String: Any] { - if dict.keys.contains(key) { - return dict[key] - } - } - return nil - } - - func add(_ value: Any, in key: String) { - if self.dict != nil { - if self.dict![key] as? [Any] != nil { - var temp = self.dict![key] as? [Any] ?? [] - temp.append(value) - self.dict!.updateValue(temp, forKey: key) - } - } - } - - func remove(_ value: String, from key: String) { - if self.dict != nil { - if self.dict![key] as? [String] != nil { - var temp = self.dict![key] as? [String] ?? [] - if let index = temp.firstIndex(of: value) { - temp.remove(at: index) - } - self.dict!.updateValue(temp, forKey: key) - } - } - } - - func remove(index: Int, from key: String) { - if self.dict != nil { - if self.dict![key] as? [Any] != nil { - var temp = self.dict![key] as? [Any] ?? [] - temp.remove(at: index) - self.dict!.updateValue(temp, forKey: key) - } - } - } - - func set(_ key: String, to value: Any) { - if self.dict != nil { - self.dict![key] = value - } - } - - func set(_ key: String, inSection section: String, to value: Any?) { - if self.dict != nil { - if self.dict!.keys.contains(section), let value = value { - var temp = self.dict![section] as? [String: Any] ?? [:] - temp.updateValue(value, forKey: key) - self.dict!.updateValue(temp, forKey: section) - } - } - } - - func data() -> Data? { - do { - try self.convertToJson() - return self.json - } catch { - return nil - } - } - - func save(to manager: inout NETunnelProviderManager) throws { - self.fix() - if let data = self.data() { - let providerProtocol = NETunnelProviderProtocol() - #if os(iOS) - providerProtocol.providerBundleIdentifier = "eu.neilalexander.yggdrasil.extension" - #elseif os(OSX) - providerProtocol.providerBundleIdentifier = "eu.neilalexander.yggdrasilmac.extension" - #endif - providerProtocol.providerConfiguration = [ "json": data ] - providerProtocol.serverAddress = "yggdrasil" - providerProtocol.username = self.get("EncryptionPublicKey") as? String ?? "(unknown public key)" - - let disconnectrule = NEOnDemandRuleDisconnect() - var rules: [NEOnDemandRule] = [disconnectrule] - if self.get("WiFi", inSection: "AutoStart") as? Bool ?? false { - let wifirule = NEOnDemandRuleConnect() - wifirule.interfaceTypeMatch = .wiFi - rules.insert(wifirule, at: 0) - } - #if canImport(UIKit) - if self.get("Mobile", inSection: "AutoStart") as? Bool ?? false { - let mobilerule = NEOnDemandRuleConnect() - mobilerule.interfaceTypeMatch = .cellular - rules.insert(mobilerule, at: 0) - } - #endif - manager.onDemandRules = rules - manager.isOnDemandEnabled = rules.count > 1 - providerProtocol.disconnectOnSleep = rules.count > 1 - - manager.protocolConfiguration = providerProtocol - - manager.saveToPreferences(completionHandler: { (error:Error?) in - if let error = error { - print(error) - } else { - print("Save successfully") - NotificationCenter.default.post(name: NSNotification.Name.YggdrasilSettingsUpdated, object: self) - } - }) - } - } - - private func convertToDict() throws { - self.dict = try JSONSerialization.jsonObject(with: self.json!, options: []) as? [String: Any] - } - - private func convertToJson() throws { - self.json = try JSONSerialization.data(withJSONObject: self.dict as Any, options: .prettyPrinted) - } - - #if canImport(UIKit) - override func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { - return "yggdrasil.conf" - } - - override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { - return self.data() - } - - func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String { - if let pubkey = self.get("EncryptionPublicKey") as? String, pubkey.count > 56 { - return "yggdrasil-\(pubkey.dropFirst(56)).conf.json" - } - return "yggdrasil.conf.json" - } - #endif -} diff --git a/Yggdrasil Network Cross-Platform/CrossPlatformAppDelegate.swift b/Yggdrasil Network Cross-Platform/CrossPlatformAppDelegate.swift deleted file mode 100644 index 249bd47..0000000 --- a/Yggdrasil Network Cross-Platform/CrossPlatformAppDelegate.swift +++ /dev/null @@ -1,151 +0,0 @@ -// -// AppDelegateExtension.swift -// Yggdrasil Network -// -// Created by Neil Alexander on 11/01/2019. -// - -import Foundation -import NetworkExtension -import Yggdrasil -import UIKit - -class CrossPlatformAppDelegate: PlatformAppDelegate { - var vpnManager: NETunnelProviderManager = NETunnelProviderManager() - - #if os(iOS) - let yggdrasilComponent = "eu.neilalexander.yggdrasil.extension" - #elseif os(OSX) - let yggdrasilComponent = "eu.neilalexander.yggdrasilmac.extension" - #endif - - var yggdrasilConfig: ConfigurationProxy? = nil - - var yggdrasilAdminTimer: DispatchSourceTimer? - - var yggdrasilSelfIP: String = "N/A" - var yggdrasilSelfSubnet: String = "N/A" - var yggdrasilSelfCoords: String = "[]" - - var yggdrasilPeers: [[String: Any]] = [[:]] - var yggdrasilSwitchPeers: [[String: Any]] = [[:]] - var yggdrasilNodeInfo: [String: Any] = [:] - - func applicationDidBecomeActive(_ application: UIApplication) { - if self.yggdrasilAdminTimer == nil { - self.yggdrasilAdminTimer = DispatchSource.makeTimerSource(flags: .strict, queue: DispatchQueue(label: "Admin Queue")) - self.yggdrasilAdminTimer!.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.seconds(2), leeway: DispatchTimeInterval.seconds(1)) - self.yggdrasilAdminTimer!.setEventHandler { - self.makeIPCRequests() - } - } - if self.yggdrasilAdminTimer != nil { - self.yggdrasilAdminTimer!.resume() - } - - NotificationCenter.default.addObserver(forName: .NEVPNStatusDidChange, object: nil, queue: nil, using: { notification in - if let conn = notification.object as? NEVPNConnection { - self.updateStatus(conn: conn) - } - }) - - self.updateStatus(conn: self.vpnManager.connection) - } - - func updateStatus(conn: NEVPNConnection) { - if conn.status == .connected { - self.makeIPCRequests() - } else if conn.status == .disconnecting || conn.status == .disconnected { - self.clearStatus() - } - } - - func applicationWillResignActive(_ application: UIApplication) { - if self.yggdrasilAdminTimer != nil { - self.yggdrasilAdminTimer!.suspend() - } - } - - func vpnTunnelProviderManagerInit() { - NETunnelProviderManager.loadAllFromPreferences { (savedManagers: [NETunnelProviderManager]?, error: Error?) in - if let error = error { - print(error) - } - - if let savedManagers = savedManagers { - for manager in savedManagers { - if (manager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier == self.yggdrasilComponent { - print("Found saved VPN Manager") - self.vpnManager = manager - } - } - } - - self.vpnManager.loadFromPreferences(completionHandler: { (error: Error?) in - if let error = error { - print(error) - } - - if let vpnConfig = self.vpnManager.protocolConfiguration as? NETunnelProviderProtocol, - let confJson = vpnConfig.providerConfiguration!["json"] as? Data { - print("Found existing protocol configuration") - self.yggdrasilConfig = try? ConfigurationProxy(json: confJson) - } else { - print("Generating new protocol configuration") - self.yggdrasilConfig = ConfigurationProxy() - } - - self.vpnManager.localizedDescription = "Yggdrasil" - self.vpnManager.isEnabled = true - - - if let config = self.yggdrasilConfig { - try? config.save(to: &self.vpnManager) - } - }) - } - } - - func makeIPCRequests() { - if self.vpnManager.connection.status != .connected { - return - } - if let session = self.vpnManager.connection as? NETunnelProviderSession { - try? session.sendProviderMessage("address".data(using: .utf8)!) { (address) in - self.yggdrasilSelfIP = String(data: address!, encoding: .utf8)! - NotificationCenter.default.post(name: .YggdrasilSelfUpdated, object: nil) - } - try? session.sendProviderMessage("subnet".data(using: .utf8)!) { (subnet) in - self.yggdrasilSelfSubnet = String(data: subnet!, encoding: .utf8)! - NotificationCenter.default.post(name: .YggdrasilSelfUpdated, object: nil) - } - try? session.sendProviderMessage("coords".data(using: .utf8)!) { (coords) in - self.yggdrasilSelfCoords = String(data: coords!, encoding: .utf8)! - NotificationCenter.default.post(name: .YggdrasilSelfUpdated, object: nil) - } - try? session.sendProviderMessage("peers".data(using: .utf8)!) { (peers) in - if let jsonResponse = try? JSONSerialization.jsonObject(with: peers!, options: []) as? [[String: Any]] { - self.yggdrasilPeers = jsonResponse - NotificationCenter.default.post(name: .YggdrasilPeersUpdated, object: nil) - } - } - try? session.sendProviderMessage("switchpeers".data(using: .utf8)!) { (switchpeers) in - if let jsonResponse = try? JSONSerialization.jsonObject(with: switchpeers!, options: []) as? [[String: Any]] { - self.yggdrasilSwitchPeers = jsonResponse - NotificationCenter.default.post(name: .YggdrasilSwitchPeersUpdated, object: nil) - } - } - } - } - - func clearStatus() { - self.yggdrasilSelfIP = "N/A" - self.yggdrasilSelfSubnet = "N/A" - self.yggdrasilSelfCoords = "[]" - self.yggdrasilPeers = [] - self.yggdrasilSwitchPeers = [] - NotificationCenter.default.post(name: .YggdrasilSelfUpdated, object: nil) - NotificationCenter.default.post(name: .YggdrasilPeersUpdated, object: nil) - NotificationCenter.default.post(name: .YggdrasilSwitchPeersUpdated, object: nil) - } -} diff --git a/Yggdrasil Network Extension/PacketTunnelProvider.swift b/Yggdrasil Network Extension/PacketTunnelProvider.swift index 22cb47e..a444de0 100644 --- a/Yggdrasil Network Extension/PacketTunnelProvider.swift +++ b/Yggdrasil Network Extension/PacketTunnelProvider.swift @@ -5,9 +5,12 @@ import Yggdrasil class PacketTunnelProvider: NEPacketTunnelProvider { var yggdrasil: MobileYggdrasil = MobileYggdrasil() - var conduit: DummyConduitEndpoint? = nil var yggdrasilConfig: ConfigurationProxy? + private var readThread: Thread? + private var writeThread: Thread? + private var writeBuffer = Data(count: 65535) + @objc func readPacketsFromTun() { autoreleasepool { self.packetFlow.readPackets { (packets: [Data], protocols: [NSNumber]) in @@ -28,7 +31,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } } - + func startYggdrasil() -> Error? { var err: Error? = nil @@ -47,7 +50,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { NSLog("Configuration loaded") do { - self.conduit = try self.yggdrasil.startJSON(config.data()) + try self.yggdrasil.startJSON(config.data()) } catch { NSLog("Starting Yggdrasil process produced an error: " + error.localizedDescription) return @@ -62,6 +65,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { let tunnelNetworkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: address) tunnelNetworkSettings.ipv6Settings = NEIPv6Settings(addresses: [address], networkPrefixLengths: [7]) tunnelNetworkSettings.ipv6Settings?.includedRoutes = [NEIPv6Route(destinationAddress: "0200::", networkPrefixLength: 7)] + tunnelNetworkSettings.mtu = NSNumber(integerLiteral: self.yggdrasil.getMTU()) NSLog("Setting tunnel network settings...") @@ -73,16 +77,19 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } else { NSLog("Yggdrasil tunnel settings set successfully") - let readthread: Thread = Thread(target: self, selector: #selector(self.readPacketsFromTun), object: nil) - readthread.name = "TUN Packet Reader" - readthread.qualityOfService = .utility + self.readThread = Thread(target: self, selector: #selector(self.readPacketsFromTun), object: nil) + if let readThread = self.readThread { + readThread.name = "TUN Packet Reader" + readThread.qualityOfService = .utility + readThread.start() + } - let writethread: Thread = Thread(target: self, selector: #selector(self.writePacketsToTun), object: nil) - writethread.name = "TUN Packet Writer" - writethread.qualityOfService = .utility - - readthread.start() - writethread.start() + self.writeThread = Thread(target: self, selector: #selector(self.writePacketsToTun), object: nil) + if let writeThread = self.writeThread { + writeThread.name = "TUN Packet Writer" + writeThread.qualityOfService = .utility + writeThread.start() + } } } } @@ -110,6 +117,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { + self.readThread?.cancel() + self.writeThread?.cancel() try? self.yggdrasil.stop() super.stopTunnel(with: reason, completionHandler: completionHandler) } @@ -125,8 +134,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler?(self.yggdrasil.getCoordsString().data(using: .utf8)) case "peers": completionHandler?(self.yggdrasil.getPeersJSON().data(using: .utf8)) - case "switchpeers": - completionHandler?(self.yggdrasil.getSwitchPeersJSON().data(using: .utf8)) + case "dht": + completionHandler?(self.yggdrasil.getDHTJSON().data(using: .utf8)) default: completionHandler?(nil) } diff --git a/Yggdrasil Network iOS/Application/NSNotification.swift b/Yggdrasil Network iOS/Application/NSNotification.swift index 537668c..b0e6fd5 100644 --- a/Yggdrasil Network iOS/Application/NSNotification.swift +++ b/Yggdrasil Network iOS/Application/NSNotification.swift @@ -14,6 +14,6 @@ import AppKit extension Notification.Name { static let YggdrasilSelfUpdated = Notification.Name("YggdrasilSelfUpdated") static let YggdrasilPeersUpdated = Notification.Name("YggdrasilPeersUpdated") - static let YggdrasilSwitchPeersUpdated = Notification.Name("YggdrasilSwitchPeersUpdated") static let YggdrasilSettingsUpdated = Notification.Name("YggdrasilSettingsUpdated") + static let YggdrasilDHTUpdated = Notification.Name("YggdrasilPeersUpdated") } diff --git a/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/Contents.json b/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/Contents.json index b556306..4e7019e 100644 --- a/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/Contents.json +++ b/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/Contents.json @@ -1,23 +1,56 @@ { "images" : [ { - "idiom" : "universal", "filename" : "img1.png", + "idiom" : "universal", "scale" : "1x" }, { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "img1w.png", "idiom" : "universal", + "scale" : "1x" + }, + { "filename" : "img2.png", + "idiom" : "universal", "scale" : "2x" }, { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "img2w.png", "idiom" : "universal", + "scale" : "2x" + }, + { "filename" : "img3.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "img3w.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img1w.png b/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img1w.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cd7df535543db26bfdb839c48bc34d1ed84a2e GIT binary patch literal 17829 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 M07*qoM6N<$g6`(Swg3PC literal 0 HcmV?d00001 diff --git a/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img2w.png b/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img2w.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bd98787ebb5d4071710783708c39ccc1d0fc68 GIT binary patch literal 38935 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 literal 0 HcmV?d00001 diff --git a/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img3w.png b/Yggdrasil Network iOS/Assets.xcassets/YggdrasilNetwork.imageset/img3w.png new file mode 100644 index 0000000000000000000000000000000000000000..902eefd60905e372afed29292d4fb328f90a6bd8 GIT binary patch literal 62710 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 GA^!s^67oI( literal 0 HcmV?d00001 diff --git a/Yggdrasil Network iOS/Storyboards/Base.lproj/LaunchScreen.storyboard b/Yggdrasil Network iOS/Storyboards/Base.lproj/LaunchScreen.storyboard index 16aafe8..f584721 100644 --- a/Yggdrasil Network iOS/Storyboards/Base.lproj/LaunchScreen.storyboard +++ b/Yggdrasil Network iOS/Storyboards/Base.lproj/LaunchScreen.storyboard @@ -1,12 +1,11 @@ - - - - + + - + + @@ -19,20 +18,21 @@ - + + - + + @@ -41,7 +41,6 @@ - @@ -50,6 +49,12 @@ - + + + + + + + diff --git a/Yggdrasil Network iOS/Storyboards/Base.lproj/Main.storyboard b/Yggdrasil Network iOS/Storyboards/Base.lproj/Main.storyboard index 2544e02..69f6769 100644 --- a/Yggdrasil Network iOS/Storyboards/Base.lproj/Main.storyboard +++ b/Yggdrasil Network iOS/Storyboards/Base.lproj/Main.storyboard @@ -1,9 +1,11 @@ - - + + - + + + @@ -11,20 +13,19 @@ - - + + - - + - + - + - + - - + - + - + - + - + @@ -135,7 +136,7 @@ - + @@ -150,22 +151,21 @@ - - + + - - + - + - + @@ -199,17 +199,17 @@ - + - + - + - + - + - - The above options allow you to control whether your device is reachable from other devices on the network. "All outgoing traffic" allows connections only to devices that you initiate first. This does not affect peerings. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - @@ -351,17 +261,17 @@ - Configuration will be exported to the Files app. Your configuration contains your private keys which are extremely sensitive. You must not share it with others. + Configuration will be exported to the Files app. Your configuration contains your private key which is extremely sensitive. You must not share it with others. - + - + - + - + @@ -440,7 +346,7 @@ - + @@ -455,28 +361,27 @@ - - + + - - + - + - + - + @@ -492,14 +397,14 @@ - + - + - + - + + + + + + + + + + + + + @@ -660,6 +589,7 @@ + @@ -669,15 +599,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -691,9 +651,10 @@ - + + @@ -701,4 +662,13 @@ + + + + + + + + + diff --git a/Yggdrasil Network iOS/View Controllers/PeersViewController.swift b/Yggdrasil Network iOS/View Controllers/PeersViewController.swift index 0105ad4..c7bca2c 100644 --- a/Yggdrasil Network iOS/View Controllers/PeersViewController.swift +++ b/Yggdrasil Network iOS/View Controllers/PeersViewController.swift @@ -49,7 +49,7 @@ class PeersViewController: UITableViewController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch section { - case 0: return app.yggdrasilSwitchPeers.count + case 0: return app.yggdrasilPeers.count case 1: if let config = self.app.yggdrasilConfig { if let peers = config.get("Peers") as? [String] { @@ -58,9 +58,6 @@ class PeersViewController: UITableViewController { } return 0 case 2: - if UIDevice.current.hasCellularCapabilites { - return 3 - } return 2 default: return 0 } @@ -70,20 +67,18 @@ class PeersViewController: UITableViewController { switch indexPath.section { case 0: let cell = tableView.dequeueReusableCell(withIdentifier: "discoveredPeerPrototype", for: indexPath) - let peers = app.yggdrasilSwitchPeers.sorted { (a, b) -> Bool in + let peers = app.yggdrasilPeers.sorted { (a, b) -> Bool in return (a["Port"] as! Int) < (b["Port"] as! Int) } if indexPath.row < peers.count { let value = peers[indexPath.row] let proto = value["Protocol"] as? String ?? "tcp" - let sent = value["BytesSent"] as? Double ?? 0 - let recvd = value["BytesRecvd"] as? Double ?? 0 - let rx = self.format(bytes: sent) - let tx = self.format(bytes: recvd) + let remote = value["Remote"] as? String ?? "unknown" + let prio = value["Priority"] as? Int ?? 0 - cell.textLabel?.text = "\(value["Endpoint"] ?? "unknown")" - cell.detailTextLabel?.text = "\(proto.uppercased()) peer on port \(value["Port"] ?? "unknown"), sent \(tx), received \(rx)" + cell.textLabel?.text = "\(value["IP"] ?? "(unknown)")" + cell.detailTextLabel?.text = "\(proto.uppercased()): \(remote)" } return cell case 1: @@ -101,33 +96,24 @@ class PeersViewController: UITableViewController { case 0: let cell = tableView.dequeueReusableCell(withIdentifier: "togglePrototype", for: indexPath) as! ToggleTableViewCell cell.isUserInteractionEnabled = true - cell.label?.text = "Search for multicast peers" + cell.label?.text = "Discoverable over multicast" cell.label?.isEnabled = true - cell.toggle?.addTarget(self, action: #selector(toggledMulticast), for: .valueChanged) + cell.toggle?.addTarget(self, action: #selector(toggledMulticastBeacons), for: .valueChanged) cell.toggle?.isEnabled = true if let config = self.app.yggdrasilConfig { - let interfaces = config.get("MulticastInterfaces") as? [String] ?? [] - cell.toggle?.isOn = interfaces.contains("en*") + cell.toggle?.isOn = config.multicastBeacons } return cell case 1: let cell = tableView.dequeueReusableCell(withIdentifier: "togglePrototype", for: indexPath) as! ToggleTableViewCell - cell.isUserInteractionEnabled = false - cell.label?.text = "Search for nearby iOS peers" - cell.label?.isEnabled = false - cell.toggle?.addTarget(self, action: #selector(toggledAWDL), for: .valueChanged) - cell.toggle?.setOn(false, animated: false) - cell.toggle?.isEnabled = false - /*if let config = self.app.yggdrasilConfig { - let interfaces = config.get("MulticastInterfaces") as? [String] ?? [] - cell.toggle?.isOn = interfaces.contains("awdl0") - }*/ - return cell - case 2: - let cell = tableView.dequeueReusableCell(withIdentifier: "menuPrototype", for: indexPath) cell.isUserInteractionEnabled = true - cell.textLabel?.text = "Device settings" - cell.textLabel?.isEnabled = true + cell.label?.text = "Search for multicast peers" + cell.label?.isEnabled = true + cell.toggle?.addTarget(self, action: #selector(toggledMulticastListen), for: .valueChanged) + cell.toggle?.isEnabled = true + if let config = self.app.yggdrasilConfig { + cell.toggle?.isOn = config.multicastListen + } return cell default: let cell = tableView.dequeueReusableCell(withIdentifier: "menuPrototype", for: indexPath) @@ -163,28 +149,16 @@ class PeersViewController: UITableViewController { return "\(numberString) \(suffix)" } - @objc func toggledMulticast(_ sender: UISwitch) { + @objc func toggledMulticastBeacons(_ sender: UISwitch) { if let config = self.app.yggdrasilConfig { - var interfaces = config.get("MulticastInterfaces") as! [String] - if sender.isOn { - interfaces.append("en*") - } else { - interfaces.removeAll(where: { $0 == "en*" }) - } - config.set("MulticastInterfaces", to: interfaces as [String]) + config.multicastBeacons = sender.isOn try? config.save(to: &app.vpnManager) } } - @objc func toggledAWDL(_ sender: UISwitch) { + @objc func toggledMulticastListen(_ sender: UISwitch) { if let config = self.app.yggdrasilConfig { - var interfaces = config.get("MulticastInterfaces") as! [String] - if sender.isOn { - interfaces.append("awdl0") - } else { - interfaces.removeAll(where: { $0 == "awdl0" }) - } - config.set("MulticastInterfaces", to: interfaces as [String]) + config.multicastListen = sender.isOn try? config.save(to: &app.vpnManager) } } @@ -214,7 +188,7 @@ class PeersViewController: UITableViewController { override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { switch section { case 1: - return "Yggdrasil will automatically attempt to connect to configured peers when started." + return "Yggdrasil will automatically attempt to connect to configured peers when started. If you configure more than one peer, your device may carry traffic on behalf of other network nodes. Avoid this by configuring only a single peer." case 2: var str = "Multicast peers will be discovered on the same Wi-Fi network or via USB." if UIDevice.current.hasCellularCapabilites { diff --git a/Yggdrasil Network iOS/View Controllers/SettingsViewController.swift b/Yggdrasil Network iOS/View Controllers/SettingsViewController.swift index 9637a46..073d853 100644 --- a/Yggdrasil Network iOS/View Controllers/SettingsViewController.swift +++ b/Yggdrasil Network iOS/View Controllers/SettingsViewController.swift @@ -13,28 +13,18 @@ class SettingsViewController: UITableViewController, UIDocumentBrowserViewContro @IBOutlet weak var deviceNameField: UITextField! - @IBOutlet weak var encryptionPublicKeyLabel: UILabel! @IBOutlet weak var signingPublicKeyLabel: UILabel! @IBOutlet weak var autoStartWiFiCell: UITableViewCell! @IBOutlet weak var autoStartMobileCell: UITableViewCell! - @IBOutlet weak var sessionFirewallPeeredCell: UITableViewCell! - @IBOutlet weak var sessionFirewallOtherCell: UITableViewCell! - @IBOutlet weak var sessionFirewallOutboundCell: UITableViewCell! - override func viewDidLoad() { super.viewDidLoad() if let config = self.app.yggdrasilConfig { deviceNameField.text = config.get("name", inSection: "NodeInfo") as? String ?? "" - encryptionPublicKeyLabel.text = config.get("EncryptionPublicKey") as? String ?? "Unknown" - signingPublicKeyLabel.text = config.get("SigningPublicKey") as? String ?? "Unknown" - - sessionFirewallPeeredCell.accessoryType = config.get("AllowFromDirect", inSection: "SessionFirewall") as? Bool ?? true ? .checkmark : .none - sessionFirewallOtherCell.accessoryType = config.get("AllowFromRemote", inSection: "SessionFirewall") as? Bool ?? true ? .checkmark : .none - sessionFirewallOutboundCell.accessoryType = config.get("AlwaysAllowOutbound", inSection: "SessionFirewall") as? Bool ?? true ? .checkmark : .none - + signingPublicKeyLabel.text = config.get("PublicKey") as? String ?? config.get("SigningPublicKey") as? String ?? "Unknown" + autoStartWiFiCell.accessoryType = config.get("WiFi", inSection: "AutoStart") as? Bool ?? false ? .checkmark : .none autoStartMobileCell.accessoryType = config.get("Mobile", inSection: "AutoStart") as? Bool ?? false ? .checkmark : .none } @@ -61,20 +51,7 @@ class SettingsViewController: UITableViewController, UIDocumentBrowserViewContro try? config.save(to: &app.vpnManager) } } - case 2: - let settings = [ - "AllowFromDirect", - "AllowFromRemote", - "AlwaysAllowOutbound" - ] - if let cell = tableView.cellForRow(at: indexPath) { - cell.accessoryType = cell.accessoryType == .checkmark ? .none : .checkmark - if let config = self.app.yggdrasilConfig { - config.set(settings[indexPath.last!], inSection: "SessionFirewall", to: cell.accessoryType == .checkmark) - try? config.save(to: &app.vpnManager) - } - } - case 4: + case 3: switch indexPath.last { case 0: // import if #available(iOS 11.0, *) { @@ -113,7 +90,7 @@ class SettingsViewController: UITableViewController, UIDocumentBrowserViewContro default: break } - case 5: + case 4: let alert = UIAlertController(title: "Warning", message: "This operation will reset your configuration and generate new keys. This is not reversible unless your configuration has been exported. Changes will not take effect until the next time Yggdrasil is restarted.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Reset", style: .destructive, handler: { action in self.app.yggdrasilConfig = ConfigurationProxy() @@ -133,7 +110,6 @@ class SettingsViewController: UITableViewController, UIDocumentBrowserViewContro self.dismiss(animated: true, completion: nil) } - @available(iOS 11.0, *) func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL]) { do { if let url = documentURLs.first { diff --git a/Yggdrasil Network iOS/View Controllers/SplitViewController.swift b/Yggdrasil Network iOS/View Controllers/SplitViewController.swift index c4e580d..4149fd3 100644 --- a/Yggdrasil Network iOS/View Controllers/SplitViewController.swift +++ b/Yggdrasil Network iOS/View Controllers/SplitViewController.swift @@ -14,5 +14,14 @@ class SplitViewController: UISplitViewController, UISplitViewControllerDelegate self.delegate = self self.preferredDisplayMode = .allVisible } - + + func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { + return true + } + + @available(iOS 14.0,*) + func splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column) -> UISplitViewController.Column { + return .primary + } + } diff --git a/Yggdrasil Network iOS/View Controllers/TableViewController.swift b/Yggdrasil Network iOS/View Controllers/TableViewController.swift index 7261e85..58870a9 100644 --- a/Yggdrasil Network iOS/View Controllers/TableViewController.swift +++ b/Yggdrasil Network iOS/View Controllers/TableViewController.swift @@ -20,10 +20,12 @@ class TableViewController: UITableViewController { @IBOutlet var statsSelfCoords: UILabel! @IBOutlet var statsSelfPeers: UILabel! + @IBOutlet var statsVersion: UILabel! + override func viewDidLoad() { NotificationCenter.default.addObserver(self, selector: #selector(self.onYggdrasilSelfUpdated), name: NSNotification.Name.YggdrasilSelfUpdated, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.onYggdrasilPeersUpdated), name: NSNotification.Name.YggdrasilPeersUpdated, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.onYggdrasilSwitchPeersUpdated), name: NSNotification.Name.YggdrasilSwitchPeersUpdated, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.onYggdrasilDHTUpdated), name: NSNotification.Name.YggdrasilDHTUpdated, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.onYggdrasilSettingsUpdated), name: NSNotification.Name.YggdrasilSettingsUpdated, object: nil) } @@ -39,6 +41,8 @@ class TableViewController: UITableViewController { if let row = self.tableView.indexPathForSelectedRow { self.tableView.deselectRow(at: row, animated: true) } + + self.statsVersion.text = Yggdrasil.MobileGetVersion() } override func viewWillDisappear(_ animated: Bool) { @@ -65,18 +69,18 @@ class TableViewController: UITableViewController { if let footer = toggleTableView.footerView(forSection: 0) { if let label = footer.textLabel { - label.text = app.vpnManager.isOnDemandEnabled ? "Yggdrasil will automatically stop and start based on settings." : "You must restart Yggdrasil to make configuration changes effective." + label.text = app.vpnManager.isOnDemandEnabled ? "Yggdrasil is configured to automatically start and stop based on available connectivity." : "Yggdrasil is configured to start and stop manually." } } } func updateConnectedStatus() { if self.app.vpnManager.connection.status == .connected { - if app.yggdrasilSwitchPeers.count > 0 { - connectedStatusLabel.text = "Connected" + if app.yggdrasilDHT.count > 0 { + connectedStatusLabel.text = "Enabled" connectedStatusLabel.textColor = UIColor(red: 0.37, green: 0.79, blue: 0.35, alpha: 1.0) } else { - connectedStatusLabel.text = "No active connections" + connectedStatusLabel.text = "No connectivity" connectedStatusLabel.textColor = UIColor.red } } else { @@ -104,12 +108,12 @@ class TableViewController: UITableViewController { self.updateConnectedStatus() } - @objc func onYggdrasilSwitchPeersUpdated(notification: NSNotification) { + @objc func onYggdrasilDHTUpdated(notification: NSNotification) { self.updateConnectedStatus() } @objc func onYggdrasilPeersUpdated(notification: NSNotification) { - let peercount = app.yggdrasilSwitchPeers.count + let peercount = app.yggdrasilPeers.count if peercount <= 0 { statsSelfPeers.text = "No peers" } else if peercount == 1 { diff --git a/Yggdrasil Network.xcodeproj/project.pbxproj b/Yggdrasil Network.xcodeproj/project.pbxproj index 7d645ca..5062c55 100644 --- a/Yggdrasil Network.xcodeproj/project.pbxproj +++ b/Yggdrasil Network.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -11,13 +11,11 @@ 3939196B21E35A7C009320F3 /* PeersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3939196A21E35A7C009320F3 /* PeersViewController.swift */; }; 3939196D21E39313009320F3 /* UIDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3939196C21E39313009320F3 /* UIDevice.swift */; }; 3939197321E39815009320F3 /* ToggleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3939197221E39815009320F3 /* ToggleTableViewCell.swift */; }; - 3939197521E3AADB009320F3 /* ConfigurationProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3939197421E3AADB009320F3 /* ConfigurationProxy.swift */; }; - 3940354623F4C0C100E81A29 /* Yggdrasil.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3944B66321DAAEA500AF102D /* Yggdrasil.framework */; }; 394A1EB321DEA46400D9F553 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 394A1EB221DEA46400D9F553 /* SettingsViewController.swift */; }; 39682A392225AD15004FB670 /* CopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39682A382225AD15004FB670 /* CopyableLabel.swift */; }; - 397346D521E8E422009B17F6 /* CrossPlatformAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397346D421E8E422009B17F6 /* CrossPlatformAppDelegate.swift */; }; + 3996AF38270328080070947D /* Yggdrasil.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3996AF37270328080070947D /* Yggdrasil.xcframework */; }; + 3996AF39270328080070947D /* Yggdrasil.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3996AF37270328080070947D /* Yggdrasil.xcframework */; }; 39AE88392319C93F0010FFF6 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 39AE88382319C93F0010FFF6 /* NetworkExtension.framework */; }; - 39AE883A2319CA750010FFF6 /* ConfigurationProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3939197421E3AADB009320F3 /* ConfigurationProxy.swift */; }; 39CC924C221DEDCE004960DC /* NSNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CC924B221DEDCE004960DC /* NSNotification.swift */; }; 39CC924D221DEDD3004960DC /* NSNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CC924B221DEDCE004960DC /* NSNotification.swift */; }; E593CE6F1DF8FC3C00D7265D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E593CE6E1DF8FC3C00D7265D /* AppDelegate.swift */; }; @@ -60,12 +58,9 @@ 3939196A21E35A7C009320F3 /* PeersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersViewController.swift; sourceTree = ""; }; 3939196C21E39313009320F3 /* UIDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIDevice.swift; sourceTree = ""; }; 3939197221E39815009320F3 /* ToggleTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleTableViewCell.swift; sourceTree = ""; }; - 3939197421E3AADB009320F3 /* ConfigurationProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationProxy.swift; sourceTree = ""; }; - 3944B66321DAAEA500AF102D /* Yggdrasil.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Yggdrasil.framework; sourceTree = ""; }; 394A1EB221DEA46400D9F553 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; 39682A382225AD15004FB670 /* CopyableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyableLabel.swift; sourceTree = ""; }; - 397346D021E8BB5F009B17F6 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetworkExtension.framework; sourceTree = DEVELOPER_DIR; }; - 397346D421E8E422009B17F6 /* CrossPlatformAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrossPlatformAppDelegate.swift; sourceTree = ""; }; + 3996AF37270328080070947D /* Yggdrasil.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Yggdrasil.xcframework; sourceTree = ""; }; 39AE88382319C93F0010FFF6 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; 39CC924B221DEDCE004960DC /* NSNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSNotification.swift; sourceTree = ""; }; E593CE6B1DF8FC3C00D7265D /* YggdrasilNetwork.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = YggdrasilNetwork.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -85,6 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3996AF38270328080070947D /* Yggdrasil.xcframework in Frameworks */, 39AE88392319C93F0010FFF6 /* NetworkExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -93,7 +89,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3940354623F4C0C100E81A29 /* Yggdrasil.framework in Frameworks */, + 3996AF39270328080070947D /* Yggdrasil.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -149,29 +145,18 @@ 399D032221DA775D0016354F /* Frameworks */ = { isa = PBXGroup; children = ( + 3996AF37270328080070947D /* Yggdrasil.xcframework */, 39AE88382319C93F0010FFF6 /* NetworkExtension.framework */, - 397346D021E8BB5F009B17F6 /* NetworkExtension.framework */, - 3944B66321DAAEA500AF102D /* Yggdrasil.framework */, ); name = Frameworks; sourceTree = ""; }; - 39AE88372319C8840010FFF6 /* Yggdrasil Network Cross-Platform */ = { - isa = PBXGroup; - children = ( - 397346D421E8E422009B17F6 /* CrossPlatformAppDelegate.swift */, - 3939197421E3AADB009320F3 /* ConfigurationProxy.swift */, - ); - path = "Yggdrasil Network Cross-Platform"; - sourceTree = ""; - }; E593CE621DF8FC3C00D7265D = { isa = PBXGroup; children = ( 3913E99E21DB9B41001E0EC7 /* YggdrasilNetwork.entitlements */, 3913E99C21DB9B1C001E0EC7 /* YggdrasilNetworkExtension.entitlements */, E593CE981DF905AF00D7265D /* Yggdrasil Network Extension */, - 39AE88372319C8840010FFF6 /* Yggdrasil Network Cross-Platform */, E593CE6D1DF8FC3C00D7265D /* Yggdrasil Network iOS */, E593CE6C1DF8FC3C00D7265D /* Products */, 399D032221DA775D0016354F /* Frameworks */, @@ -256,14 +241,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1010; - LastUpgradeCheck = 1030; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = ""; TargetAttributes = { E593CE6A1DF8FC3C00D7265D = { CreatedOnToolsVersion = 8.1; - DevelopmentTeam = R9AV23TXF2; LastSwiftMigration = 1030; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -281,9 +264,7 @@ }; E593CE961DF905AF00D7265D = { CreatedOnToolsVersion = 8.1; - DevelopmentTeam = R9AV23TXF2; LastSwiftMigration = 1030; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -348,9 +329,7 @@ 394A1EB321DEA46400D9F553 /* SettingsViewController.swift in Sources */, E593CE711DF8FC3C00D7265D /* TableViewController.swift in Sources */, 39682A392225AD15004FB670 /* CopyableLabel.swift in Sources */, - 3939197521E3AADB009320F3 /* ConfigurationProxy.swift in Sources */, E593CE6F1DF8FC3C00D7265D /* AppDelegate.swift in Sources */, - 397346D521E8E422009B17F6 /* CrossPlatformAppDelegate.swift in Sources */, 3913E9C021DD3A51001E0EC7 /* SplitViewController.swift in Sources */, 39CC924C221DEDCE004960DC /* NSNotification.swift in Sources */, ); @@ -362,7 +341,6 @@ files = ( 39CC924D221DEDD3004960DC /* NSNotification.swift in Sources */, E593CE9C1DF905AF00D7265D /* PacketTunnelProvider.swift in Sources */, - 39AE883A2319CA750010FFF6 /* ConfigurationProxy.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -421,6 +399,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -446,7 +425,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.1; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -484,6 +463,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -503,7 +483,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.1; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; @@ -522,9 +502,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = YggdrasilNetwork.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 21; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_TEAM = R9AV23TXF2; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -532,14 +512,17 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = "$(SRCROOT)/Yggdrasil Network iOS/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = eu.neilalexander.yggdrasil; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; STRIP_INSTALLED_PRODUCT = NO; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -553,9 +536,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = YggdrasilNetwork.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 21; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_TEAM = R9AV23TXF2; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -563,13 +546,16 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = "$(SRCROOT)/Yggdrasil Network iOS/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = eu.neilalexander.yggdrasil; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -580,9 +566,9 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = YggdrasilNetworkExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 21; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_TEAM = R9AV23TXF2; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -590,7 +576,8 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = "$(SRCROOT)/Yggdrasil Network Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -600,8 +587,11 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; STRIP_INSTALLED_PRODUCT = NO; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Debug; }; @@ -609,9 +599,9 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = YggdrasilNetworkExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 21; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_TEAM = R9AV23TXF2; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -619,7 +609,8 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = "$(SRCROOT)/Yggdrasil Network Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -629,8 +620,11 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = "8ce353d5-fd5f-4d5e-b664-8ad294091125"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Release; }; diff --git a/Yggdrasil Network.xcodeproj/xcshareddata/xcschemes/YggdrasilNetwork.xcscheme b/Yggdrasil Network.xcodeproj/xcshareddata/xcschemes/YggdrasilNetwork.xcscheme index 759e8a3..433fa74 100644 --- a/Yggdrasil Network.xcodeproj/xcshareddata/xcschemes/YggdrasilNetwork.xcscheme +++ b/Yggdrasil Network.xcodeproj/xcshareddata/xcschemes/YggdrasilNetwork.xcscheme @@ -1,6 +1,6 @@ allow-vpn + com.apple.security.app-sandbox + com.apple.security.application-groups group.eu.neilalexander.yggdrasil + com.apple.security.network.client + diff --git a/YggdrasilNetworkExtension.entitlements b/YggdrasilNetworkExtension.entitlements index e1e1350..9069017 100644 --- a/YggdrasilNetworkExtension.entitlements +++ b/YggdrasilNetworkExtension.entitlements @@ -2,6 +2,8 @@ + com.apple.developer.networking.multicast + com.apple.developer.networking.networkextension packet-tunnel-provider @@ -10,9 +12,13 @@ allow-vpn + com.apple.security.app-sandbox + com.apple.security.application-groups group.eu.neilalexander.yggdrasil + com.apple.security.network.client +