diff options
author | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-18 21:47:43 +0200 |
---|---|---|
committer | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-18 21:49:59 +0200 |
commit | 089315ddc5b4ce8400fe8ed75887b0fe55762790 (patch) | |
tree | 6c00bc821cdf869f595246348e449b45ef3b0fc4 | |
parent | Give team to release (diff) | |
download | wireguard-apple-089315ddc5b4ce8400fe8ed75887b0fe55762790.tar.xz wireguard-apple-089315ddc5b4ce8400fe8ed75887b0fe55762790.zip |
Add settings screen. Move export as zip to settings screen.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | WireGuard.xcodeproj/project.pbxproj | 14 | ||||
-rw-r--r-- | WireGuard/Base.lproj/Main.storyboard | 159 | ||||
-rw-r--r-- | WireGuard/Coordinators/AppCoordinator.swift | 27 | ||||
-rw-r--r-- | WireGuard/ViewControllers/SetttingsTableViewController.swift | 65 | ||||
-rw-r--r-- | WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift | 11 | ||||
-rw-r--r-- | WireGuard/ViewControllers/TunnelInfoTableViewController.swift | 5 | ||||
-rw-r--r-- | WireGuard/ViewControllers/TunnelsTableViewController.swift | 6 | ||||
-rw-r--r-- | WireGuard/WireGuard-Bridging-Header.h | 1 | ||||
-rw-r--r-- | WireGuardNetworkExtension/PacketTunnelProvider.swift | 6 |
9 files changed, 253 insertions, 41 deletions
diff --git a/WireGuard.xcodeproj/project.pbxproj b/WireGuard.xcodeproj/project.pbxproj index 90a3150..15830f6 100644 --- a/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 48CF751B34E9703133F1B1AF /* Pods_WireGuard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 861983CAE8FDC13BC83E7E04 /* Pods_WireGuard.framework */; }; 4A430E802139DC8F0078172C /* icon_20pt@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A430E7F2139DC8F0078172C /* icon_20pt@3x.png */; }; 4A430E842139DCFB0078172C /* icon_60pt@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A430E832139DCFB0078172C /* icon_60pt@3x.png */; }; + 4A4349752151865E00EF92F8 /* libwg-go.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AD0900120DC4171000E9CF5 /* libwg-go.a */; }; 4A4351592124956200261999 /* Validators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4351582124956200261999 /* Validators.swift */; }; 4A43515A2124956200261999 /* Validators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4351582124956200261999 /* Validators.swift */; }; 4A43515C21249E5700261999 /* ValidatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A43515B21249E5700261999 /* ValidatorsTests.swift */; }; @@ -46,6 +47,7 @@ 4AD095C820DC4190000E9CF5 /* libwg-go.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AD0900120DC4171000E9CF5 /* libwg-go.a */; }; 4AEAC32920F14B3B007B67AB /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AEAC32820F14B3B007B67AB /* Log.swift */; }; 4AEAC32B20F14BA9007B67AB /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AEAC32A20F14BA9007B67AB /* Log.swift */; }; + 4AFB99C42150545500A745DA /* SetttingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AFB99C32150545500A745DA /* SetttingsTableViewController.swift */; }; 5FA1D4CB21249F7D00DBA2E6 /* Peer+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA1D4CA21249F7D00DBA2E6 /* Peer+Extension.swift */; }; 5FA1D4CD2124A05C00DBA2E6 /* Interface+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA1D4CC2124A05C00DBA2E6 /* Interface+Extension.swift */; }; 5FA1D5102124D80C00DBA2E6 /* String+Arrays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA1D50F2124D80C00DBA2E6 /* String+Arrays.swift */; }; @@ -134,6 +136,7 @@ 4AD095C920DC42CD000E9CF5 /* WireGuardNetworkExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuardNetworkExtension-Bridging-Header.h"; sourceTree = "<group>"; }; 4AEAC32820F14B3B007B67AB /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = "<group>"; }; 4AEAC32A20F14BA9007B67AB /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = "<group>"; }; + 4AFB99C32150545500A745DA /* SetttingsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetttingsTableViewController.swift; sourceTree = "<group>"; }; 5FA1D4CA21249F7D00DBA2E6 /* Peer+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Peer+Extension.swift"; sourceTree = "<group>"; }; 5FA1D4CC2124A05C00DBA2E6 /* Interface+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Interface+Extension.swift"; sourceTree = "<group>"; }; 5FA1D50F2124D80C00DBA2E6 /* String+Arrays.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Arrays.swift"; sourceTree = "<group>"; }; @@ -149,6 +152,7 @@ buildActionMask = 2147483647; files = ( 4ABFFEA3212D3C8300107136 /* Security.framework in Frameworks */, + 4A4349752151865E00EF92F8 /* libwg-go.a in Frameworks */, 48CF751B34E9703133F1B1AF /* Pods_WireGuard.framework in Frameworks */, 4A61D83520D98D25006C7A76 /* NetworkExtension.framework in Frameworks */, ); @@ -257,6 +261,7 @@ 4ABF718D214D8B0300A1E0BF /* TunnelInfoTableViewController.swift */, 4A4BA6D720B73CBA00223AB8 /* TunnelConfigurationTableViewController.swift */, 5FCC4342212B3092009A9C58 /* QRScanViewController.swift */, + 4AFB99C32150545500A745DA /* SetttingsTableViewController.swift */, ); path = ViewControllers; sourceTree = "<group>"; @@ -593,6 +598,7 @@ 5FA1D4CB21249F7D00DBA2E6 /* Peer+Extension.swift in Sources */, 5FA1D5122124DA6400DBA2E6 /* String+Base64.swift in Sources */, 4AC5462E2116306F00749D21 /* Tunnel+Extension.swift in Sources */, + 4AFB99C42150545500A745DA /* SetttingsTableViewController.swift in Sources */, 5FCC4343212B3092009A9C58 /* QRScanViewController.swift in Sources */, 4ABF718E214D8B0300A1E0BF /* TunnelInfoTableViewController.swift in Sources */, 4A4BAD0E20B5F6C300F12B28 /* Coordinator.swift in Sources */, @@ -796,6 +802,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/wireguard-go-bridge", + ); PRODUCT_BUNDLE_IDENTIFIER = com.wireguard.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "WireGuard Development"; @@ -823,6 +833,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/wireguard-go-bridge", + ); PRODUCT_BUNDLE_IDENTIFIER = com.wireguard.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "WireGuard Development"; diff --git a/WireGuard/Base.lproj/Main.storyboard b/WireGuard/Base.lproj/Main.storyboard index 5d8e3f5..bae91f9 100644 --- a/WireGuard/Base.lproj/Main.storyboard +++ b/WireGuard/Base.lproj/Main.storyboard @@ -89,14 +89,14 @@ <navigationItem key="navigationItem" title="WireGuard" largeTitleDisplayMode="always" id="j0L-5U-jDs"> <barButtonItem key="backBarButtonItem" title="Tunnels" id="pxL-gR-QXU"/> <rightBarButtonItems> - <barButtonItem systemItem="add" id="h2H-H8-3Tn"> + <barButtonItem title=" ⚙︎" id="DZP-sp-Hsg"> <connections> - <action selector="addProvider:" destination="kTU-BV-32R" id="xSg-ap-3Fx"/> + <action selector="showSettings:" destination="kTU-BV-32R" id="UfC-XY-zhW"/> </connections> </barButtonItem> - <barButtonItem systemItem="action" id="zxB-ao-5JR"> + <barButtonItem systemItem="add" id="h2H-H8-3Tn"> <connections> - <action selector="exportTunnels:" destination="kTU-BV-32R" id="PwM-I1-n6B"/> + <action selector="addProvider:" destination="kTU-BV-32R" id="xSg-ap-3Fx"/> </connections> </barButtonItem> </rightBarButtonItems> @@ -548,27 +548,26 @@ </tableView> <navigationItem key="navigationItem" title="Tunnel settings" id="PPu-rX-T38"> <rightBarButtonItems> - <barButtonItem systemItem="save" id="mft-1l-bWa"> + <barButtonItem title=" ⚙︎" id="Ph6-EV-NlT"> <connections> - <action selector="saveTunnelConfiguration:" destination="0VM-73-EPX" id="Hni-0w-hFF"/> + <action selector="showSettings:" destination="0VM-73-EPX" id="wx3-3w-OhG"/> </connections> </barButtonItem> - <barButtonItem systemItem="action" id="uim-Mz-omJ"> + <barButtonItem systemItem="save" id="mft-1l-bWa"> <connections> - <action selector="exportTunnel:" destination="0VM-73-EPX" id="oVI-TL-4o9"/> + <action selector="saveTunnelConfiguration:" destination="0VM-73-EPX" id="Hni-0w-hFF"/> </connections> </barButtonItem> </rightBarButtonItems> </navigationItem> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> <connections> - <outlet property="exportButton" destination="uim-Mz-omJ" id="1Tq-ie-xo7"/> <outlet property="saveButton" destination="mft-1l-bWa" id="Uif-KZ-isx"/> </connections> </tableViewController> <placeholder placeholderIdentifier="IBFirstResponder" id="j96-PK-ghN" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="916" y="-263"/> + <point key="canvasLocation" x="-671" y="-1262"/> </scene> <!--Tunnel info--> <scene sceneID="jJx-Qm-bKA"> @@ -802,11 +801,18 @@ </connections> </tableView> <navigationItem key="navigationItem" title="Tunnel info" id="Eh1-Vi-78e"> - <barButtonItem key="rightBarButtonItem" systemItem="edit" id="YRj-Ox-eKc"> - <connections> - <action selector="editTunnelConfiguration:" destination="h8W-vj-IcI" id="f1k-Y6-4c3"/> - </connections> - </barButtonItem> + <rightBarButtonItems> + <barButtonItem title=" ⚙︎" id="OME-id-5vt"> + <connections> + <action selector="showSettings:" destination="h8W-vj-IcI" id="mZN-SL-gZJ"/> + </connections> + </barButtonItem> + <barButtonItem systemItem="edit" id="YRj-Ox-eKc"> + <connections> + <action selector="editTunnelConfiguration:" destination="h8W-vj-IcI" id="f1k-Y6-4c3"/> + </connections> + </barButtonItem> + </rightBarButtonItems> </navigationItem> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> <connections> @@ -815,7 +821,7 @@ </tableViewController> <placeholder placeholderIdentifier="IBFirstResponder" id="cXx-q2-SBO" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="121" y="-263"/> + <point key="canvasLocation" x="-671" y="-469"/> </scene> <!--Scan Code--> <scene sceneID="gKN-k2-HoW"> @@ -845,7 +851,126 @@ </viewController> <placeholder placeholderIdentifier="IBFirstResponder" id="TQ2-zp-o40" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="121" y="461"/> + <point key="canvasLocation" x="162" y="793"/> + </scene> + <!--Settings--> + <scene sceneID="LLL-0v-1Z9"> + <objects> + <tableViewController storyboardIdentifier="SettingsTableViewController" id="0L2-ND-Twh" customClass="SettingsTableViewController" customModule="WireGuard" customModuleProvider="target" sceneMemberID="viewController"> + <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="xce-Ka-TsV"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> + <sections> + <tableViewSection headerTitle="Version Information" id="zRZ-jm-jpm"> + <cells> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="4T9-BK-cKk"> + <rect key="frame" x="0.0" y="55.5" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="4T9-BK-cKk" id="oh2-fj-cpB"> + <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="WireGuard for iOS" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="9LF-1X-BRX"> + <rect key="frame" x="16" y="11.5" width="139" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="(x.y.z)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="64F-sz-1fb"> + <rect key="frame" x="313" y="11.5" width="46" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <constraints> + <constraint firstItem="9LF-1X-BRX" firstAttribute="centerY" secondItem="oh2-fj-cpB" secondAttribute="centerY" id="0vh-j4-spD"/> + <constraint firstItem="64F-sz-1fb" firstAttribute="centerY" secondItem="oh2-fj-cpB" secondAttribute="centerY" id="30t-Be-YBk"/> + <constraint firstItem="64F-sz-1fb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="9LF-1X-BRX" secondAttribute="trailing" constant="16" id="Nl3-vZ-7lQ"/> + <constraint firstItem="9LF-1X-BRX" firstAttribute="leading" secondItem="oh2-fj-cpB" secondAttribute="leadingMargin" id="atb-WE-sm5"/> + <constraint firstItem="64F-sz-1fb" firstAttribute="trailing" secondItem="oh2-fj-cpB" secondAttribute="trailingMargin" id="omW-fc-mV3"/> + </constraints> + </tableViewCellContentView> + </tableViewCell> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="7To-1u-V41"> + <rect key="frame" x="0.0" y="99.5" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7To-1u-V41" id="R1k-wj-XjQ"> + <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Go userspace backend" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="ZrW-kK-iNG"> + <rect key="frame" x="16" y="11.5" width="175.5" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="(x.y.z)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZLF-fc-FG0"> + <rect key="frame" x="313" y="11.5" width="46" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <constraints> + <constraint firstItem="ZLF-fc-FG0" firstAttribute="centerY" secondItem="R1k-wj-XjQ" secondAttribute="centerY" id="COd-8Q-MkD"/> + <constraint firstItem="ZLF-fc-FG0" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ZrW-kK-iNG" secondAttribute="trailing" constant="16" id="mZA-b5-OXz"/> + <constraint firstItem="ZrW-kK-iNG" firstAttribute="leading" secondItem="R1k-wj-XjQ" secondAttribute="leadingMargin" id="v9L-hc-VeV"/> + <constraint firstItem="ZLF-fc-FG0" firstAttribute="trailing" secondItem="R1k-wj-XjQ" secondAttribute="trailingMargin" id="vbt-K7-zSd"/> + <constraint firstItem="ZrW-kK-iNG" firstAttribute="centerY" secondItem="R1k-wj-XjQ" secondAttribute="centerY" id="zMO-S4-aZv"/> + </constraints> + </tableViewCellContentView> + </tableViewCell> + </cells> + </tableViewSection> + <tableViewSection headerTitle="Export" id="A0i-t0-uNU"> + <cells> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="Xti-BC-KTP" detailTextLabel="qYk-Nl-mLx" style="IBUITableViewCellStyleSubtitle" id="J1T-67-jcC"> + <rect key="frame" x="0.0" y="199.5" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="J1T-67-jcC" id="OTJ-zk-hYF"> + <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Export tunnels to zip file" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Xti-BC-KTP"> + <rect key="frame" x="16" y="5" width="185" height="20.5"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Zip file should be shared with a location for storage." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="qYk-Nl-mLx"> + <rect key="frame" x="16" y="25.5" width="294.5" height="14.5"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="system" pointSize="12"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + </tableViewCellContentView> + </tableViewCell> + </cells> + </tableViewSection> + </sections> + <connections> + <outlet property="dataSource" destination="0L2-ND-Twh" id="iHC-iG-by3"/> + <outlet property="delegate" destination="0L2-ND-Twh" id="nAg-yY-JmZ"/> + </connections> + </tableView> + <navigationItem key="navigationItem" title="Settings" id="jxD-pO-Xgu"/> + <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> + <connections> + <outlet property="exportCell" destination="J1T-67-jcC" id="VZX-ue-ZCE"/> + <outlet property="goVersionInfoCell" destination="7To-1u-V41" id="CeX-R9-6Qh"/> + <outlet property="goVersionInfoLabel" destination="ZLF-fc-FG0" id="5si-K0-QJL"/> + <outlet property="versionInfoCell" destination="4T9-BK-cKk" id="QrQ-73-Cpq"/> + <outlet property="versionInfoLabel" destination="64F-sz-1fb" id="O1J-1X-GvV"/> + </connections> + </tableViewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="DXL-eC-zr0" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="726" y="-469"/> </scene> </scenes> <resources> diff --git a/WireGuard/Coordinators/AppCoordinator.swift b/WireGuard/Coordinators/AppCoordinator.swift index 8649c1d..9281907 100644 --- a/WireGuard/Coordinators/AppCoordinator.swift +++ b/WireGuard/Coordinators/AppCoordinator.swift @@ -137,7 +137,7 @@ class AppCoordinator: RootViewCoordinator { } // swiftlint:disable next function_body_length - func exportConfigs(barButtonItem: UIBarButtonItem) { + func exportConfigs(sourceView: UIView) { guard let path = FileManager.default .urls(for: .documentDirectory, in: .userDomainMask).first else { return @@ -196,7 +196,7 @@ class AppCoordinator: RootViewCoordinator { activityItems: [saveFileURL], applicationActivities: nil) if let popoverPresentationController = activityViewController.popoverPresentationController { - popoverPresentationController.barButtonItem = barButtonItem + popoverPresentationController.sourceView = sourceView } navigationController.present(activityViewController, animated: true) { } @@ -273,6 +273,14 @@ class AppCoordinator: RootViewCoordinator { self.navigationController.pushViewController(tunnelConfigurationViewController, animated: true) } + func showSettings() { + let settingsTableViewController = storyboard.instantiateViewController(type: SettingsTableViewController.self) + + settingsTableViewController.delegate = self + + self.navigationController.pushViewController(settingsTableViewController, animated: true) + } + public func showError(_ error: Error) { showAlert(title: NSLocalizedString("Error", comment: "Error alert title"), message: error.localizedDescription) } @@ -316,10 +324,6 @@ extension AppCoordinator: TunnelInfoTableViewControllerDelegate { } extension AppCoordinator: TunnelsTableViewControllerDelegate { - func exportTunnels(tunnelsTableViewController: TunnelsTableViewController, barButtonItem: UIBarButtonItem) { - self.exportConfigs(barButtonItem: barButtonItem) - } - func status(for tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) -> NEVPNStatus { let session = self.providerManager(for: tunnel)?.connection as? NETunnelProviderSession return session?.status ?? .invalid @@ -495,14 +499,9 @@ extension AppCoordinator: TunnelsTableViewControllerDelegate { } extension AppCoordinator: TunnelConfigurationTableViewControllerDelegate { - func export(tunnel: Tunnel, barButtonItem: UIBarButtonItem) { - exportConfig(tunnel: tunnel, barButtonItem: barButtonItem) - } - func didSave(tunnel: Tunnel, tunnelConfigurationTableViewController: TunnelConfigurationTableViewController) { saveTunnel(tunnel) } - } extension AppCoordinator: QRScanViewControllerDelegate { @@ -510,3 +509,9 @@ extension AppCoordinator: QRScanViewControllerDelegate { showTunnelConfigurationViewController(tunnel: tunnel, context: tunnel.managedObjectContext!) } } + +extension AppCoordinator: SettingsTableViewControllerDelegate { + func exportTunnels(settingsTableViewController: SettingsTableViewController, sourceView: UIView) { + self.exportConfigs(sourceView: sourceView) + } +} diff --git a/WireGuard/ViewControllers/SetttingsTableViewController.swift b/WireGuard/ViewControllers/SetttingsTableViewController.swift new file mode 100644 index 0000000..a009403 --- /dev/null +++ b/WireGuard/ViewControllers/SetttingsTableViewController.swift @@ -0,0 +1,65 @@ +// +// Copyright © 2018 WireGuard LLC. All rights reserved. +// + +import UIKit + +protocol SettingsTableViewControllerDelegate: class { + func exportTunnels(settingsTableViewController: SettingsTableViewController, sourceView: UIView) +} + +class SettingsTableViewController: UITableViewController { + + weak var delegate: SettingsTableViewControllerDelegate? + @IBOutlet weak var versionInfoCell: UITableViewCell! + @IBOutlet weak var goVersionInfoCell: UITableViewCell! + @IBOutlet weak var exportCell: UITableViewCell! + + @IBOutlet weak var versionInfoLabel: UILabel! + @IBOutlet weak var goVersionInfoLabel: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + versionInfoLabel.text = versionInformation + goVersionInfoLabel.text = goVersionInformation + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let cell = tableView.cellForRow(at: indexPath) { + switch cell { + case versionInfoCell, goVersionInfoCell: + UIPasteboard.general.string = ["WireGuard for iOS:", versionInformation, "Go userspace backend:", goVersionInformation].joined(separator: "\n") + showCopyConfirmation() + case exportCell: + delegate?.exportTunnels(settingsTableViewController: self, sourceView: exportCell) + default: + () + } + tableView.deselectRow(at: indexPath, animated: true) + } + } + + var versionInformation: String { + var versionElements: [String] = [] + if let appBuildNumber = Bundle.main.infoDictionary!["CFBundleVersion"] as? String, let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String { + versionElements.append(appVersion) + versionElements.append("(\(appBuildNumber))") + } + + return versionElements.joined(separator: " ") + } + + var goVersionInformation: String { + return wgVersion().flatMap { String(cString: $0) } ?? "" + } + + private func showCopyConfirmation() { + let confirmationAlertController = UIAlertController(title: NSLocalizedString("Copied version information", comment: ""), message: UIPasteboard.general.string, preferredStyle: .alert) + confirmationAlertController.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: "Generic OK button"), style: .default, handler: nil)) + + present(confirmationAlertController, animated: true, completion: nil) + + } +} + +extension SettingsTableViewController: Identifyable {} diff --git a/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift b/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift index d5b0740..bf6ad14 100644 --- a/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift +++ b/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift @@ -9,13 +9,12 @@ import PromiseKit protocol TunnelConfigurationTableViewControllerDelegate: class { func didSave(tunnel: Tunnel, tunnelConfigurationTableViewController: TunnelConfigurationTableViewController) - func export(tunnel: Tunnel, barButtonItem: UIBarButtonItem) + func showSettings() } class TunnelConfigurationTableViewController: UITableViewController { @IBOutlet weak var saveButton: UIBarButtonItem! - @IBOutlet weak var exportButton: UIBarButtonItem! private var viewContext: NSManagedObjectContext! private weak var delegate: TunnelConfigurationTableViewControllerDelegate? @@ -41,6 +40,10 @@ class TunnelConfigurationTableViewController: UITableViewController { return tunnel } + @IBAction func showSettings(_ sender: Any) { + delegate?.showSettings() + } + @IBAction func addPeer(_ sender: Any) { if let moc = tunnel.managedObjectContext { tableView.beginUpdates() @@ -55,10 +58,6 @@ class TunnelConfigurationTableViewController: UITableViewController { } } - @IBAction func exportTunnel(_ sender: UIBarButtonItem) { - self.delegate?.export(tunnel: tunnel, barButtonItem: sender) - } - override func numberOfSections(in tableView: UITableView) -> Int { return 3 } diff --git a/WireGuard/ViewControllers/TunnelInfoTableViewController.swift b/WireGuard/ViewControllers/TunnelInfoTableViewController.swift index 094114a..cf1f05f 100644 --- a/WireGuard/ViewControllers/TunnelInfoTableViewController.swift +++ b/WireGuard/ViewControllers/TunnelInfoTableViewController.swift @@ -9,6 +9,7 @@ import PromiseKit protocol TunnelInfoTableViewControllerDelegate: class { func configure(tunnel: Tunnel, tunnelInfoTableViewController: TunnelInfoTableViewController) + func showSettings() } class TunnelInfoTableViewController: UITableViewController { @@ -63,6 +64,10 @@ class TunnelInfoTableViewController: UITableViewController { } } + @IBAction func showSettings(_ sender: Any) { + delegate?.showSettings() + } + @IBAction func editTunnelConfiguration(_ sender: Any) { delegate?.configure(tunnel: self.tunnel, tunnelInfoTableViewController: self) } diff --git a/WireGuard/ViewControllers/TunnelsTableViewController.swift b/WireGuard/ViewControllers/TunnelsTableViewController.swift index a66d3e3..8cc26e8 100644 --- a/WireGuard/ViewControllers/TunnelsTableViewController.swift +++ b/WireGuard/ViewControllers/TunnelsTableViewController.swift @@ -10,13 +10,13 @@ import BNRCoreDataStack import NetworkExtension protocol TunnelsTableViewControllerDelegate: class { - func exportTunnels(tunnelsTableViewController: TunnelsTableViewController, barButtonItem: UIBarButtonItem) func addProvider(tunnelsTableViewController: TunnelsTableViewController) func connect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) func disconnect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) func info(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) func delete(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) func status(for tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) -> NEVPNStatus + func showSettings() } class TunnelsTableViewController: UITableViewController { @@ -66,8 +66,8 @@ class TunnelsTableViewController: UITableViewController { tableView.tableFooterView = UIView(frame: CGRect.zero) } - @IBAction func exportTunnels(_ sender: UIBarButtonItem) { - delegate?.exportTunnels(tunnelsTableViewController: self, barButtonItem: sender) + @IBAction func showSettings(_ sender: Any) { + delegate?.showSettings() } @IBAction func addProvider(_ sender: UIBarButtonItem) { diff --git a/WireGuard/WireGuard-Bridging-Header.h b/WireGuard/WireGuard-Bridging-Header.h index 8c77009..95922cc 100644 --- a/WireGuard/WireGuard-Bridging-Header.h +++ b/WireGuard/WireGuard-Bridging-Header.h @@ -3,3 +3,4 @@ // #import "Crypto/x25519.h" +#import "../wireguard-go-bridge/wireguard.h" diff --git a/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuardNetworkExtension/PacketTunnelProvider.swift index f413eec..ee6493b 100644 --- a/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -135,8 +135,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private func connect(interfaceName: String, settings: String) -> Int32 { // swiftlint:disable:this cyclomatic_complexity return withStringsAsGoStrings(interfaceName, settings) { (nameGoStr, settingsGoStr) -> Int32 in return withUnsafeMutablePointer(to: &wgContext) { (wgCtxPtr) -> Int32 in - return wgTurnOn(nameGoStr, settingsGoStr, - { (wgCtxPtr, buf, len) -> Int in + return wgTurnOn(nameGoStr, settingsGoStr, { (wgCtxPtr, buf, len) -> Int in // read_fn: Read from the TUN interface and pass it on to WireGuard guard let wgCtxPtr = wgCtxPtr else { return 0 } guard let buf = buf else { return 0 } @@ -150,8 +149,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return packetData.count } return 0 - }, - { (wgCtxPtr, buf, len) -> Int in + }, { (wgCtxPtr, buf, len) -> Int in // write_fn: Receive packets from WireGuard and write to the TUN interface guard let wgCtxPtr = wgCtxPtr else { return 0 } guard let buf = buf else { return 0 } |