]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Implement GetPeers AppIntent
authorAlessio Nossa <alessio.nossa@gmail.com>
Tue, 11 Apr 2023 15:29:52 +0000 (17:29 +0200)
committerAlessio Nossa <alessio.nossa@gmail.com>
Tue, 11 Apr 2023 22:09:21 +0000 (00:09 +0200)
Signed-off-by: Alessio Nossa <alessio.nossa@gmail.com>
Sources/WireGuardApp/UI/iOS/AppDelegate.swift
Sources/WireguardAppIntents/AppIntents.strings [new file with mode: 0644]
Sources/WireguardAppIntents/GetPeers.swift [new file with mode: 0644]
Sources/WireguardAppIntents/TunnelsOptionsProvider.swift [new file with mode: 0644]
WireGuard.xcodeproj/project.pbxproj

index 45ffa2b253b1bbaf06436421fcac09ab1e07bc3a..d8629c4d1b326cc7d8eac36d1644afa047e93913 100644 (file)
@@ -4,6 +4,7 @@
 import UIKit
 import os.log
 import Intents
+import AppIntents
 
 @UIApplicationMain
 class AppDelegate: UIResponder, UIApplicationDelegate {
@@ -47,6 +48,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
                 tunnelsManager.activationDelegate = self.mainVC
 
+                if #available(iOS 16.0, *) {
+                    AppDependencyManager.shared.add(dependency: tunnelsManager)
+                }
+
                 NotificationCenter.default.post(name: AppDelegate.tunnelsManagerReadyNotificationName,
                                                 object: self,
                                                 userInfo: nil)
diff --git a/Sources/WireguardAppIntents/AppIntents.strings b/Sources/WireguardAppIntents/AppIntents.strings
new file mode 100644 (file)
index 0000000..e539499
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
+
+// App Intents Common
+"wireguardAppIntentsWrongTunnelError %@" = "Cannot find a tunnel with the name \"%1$@\"";
+"wireguardAppIntentsMissingConfigurationError" = "The selected tunnel has no configuration.";
+
+// Get peers Intent
+"getPeersIntentName" = "Get Peers";
+"getPeersIntentDescription" = "Get list of public keys of peers in the selected configuration";
+"getPeersIntentTunnelParameterTitle" = "Tunnel";
+"getPeersIntentSummary ${tunnelName}" = "Get peers of ${tunnelName}";
diff --git a/Sources/WireguardAppIntents/GetPeers.swift b/Sources/WireguardAppIntents/GetPeers.swift
new file mode 100644 (file)
index 0000000..ce6849e
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
+
+import Foundation
+import AppIntents
+
+@available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *)
+struct GetPeers: AppIntent {
+
+    static var title = LocalizedStringResource("getPeersIntentName", table: "AppIntents")
+    static var description = IntentDescription(
+        LocalizedStringResource("getPeersIntentDescription", table: "AppIntents")
+    )
+
+    @Parameter(
+        title: LocalizedStringResource("getPeersIntentTunnelParameterTitle", table: "AppIntents"),
+        optionsProvider: TunnelsOptionsProvider()
+    )
+    var tunnelName: String
+
+    @Dependency
+    var tunnelsManager: TunnelsManager
+
+    func perform() async throws -> some ReturnsValue {
+        guard let tunnelContainer = tunnelsManager.tunnel(named: tunnelName) else {
+            throw GetPeersIntentError.wrongTunnel(name: tunnelName)
+        }
+
+        guard let tunnelConfiguration = tunnelContainer.tunnelConfiguration else {
+            throw GetPeersIntentError.missingConfiguration
+        }
+
+        let publicKeys = tunnelConfiguration.peers.map { $0.publicKey.base64Key }
+        return .result(value: publicKeys)
+    }
+
+    static var parameterSummary: some ParameterSummary {
+        Summary("getPeersIntentSummary \(\.$tunnelName)", table: "AppIntents")
+    }
+}
+
+@available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *)
+enum GetPeersIntentError: Swift.Error, CustomLocalizedStringResourceConvertible {
+    case wrongTunnel(name: String)
+    case missingConfiguration
+
+    var localizedStringResource: LocalizedStringResource {
+        switch self {
+        case .wrongTunnel(let name):
+            return LocalizedStringResource("wireguardAppIntentsWrongTunnelError \(name)", table: "AppIntents")
+        case .missingConfiguration:
+            return LocalizedStringResource("wireguardAppIntentsMissingConfigurationError", table: "AppIntents")
+        }
+    }
+}
diff --git a/Sources/WireguardAppIntents/TunnelsOptionsProvider.swift b/Sources/WireguardAppIntents/TunnelsOptionsProvider.swift
new file mode 100644 (file)
index 0000000..a21109c
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
+
+import AppIntents
+
+@available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *)
+struct TunnelsOptionsProvider: DynamicOptionsProvider {
+    @Dependency
+    var tunnelsManager: TunnelsManager
+
+    func results() async throws -> [String] {
+        let tunnelsNames = tunnelsManager.mapTunnels { $0.name }
+        return tunnelsNames
+    }
+}
index 53db590f8cea9efed922af87cb32564627109e8d..e7ad37b6634e535631b3de5a0584a81794518b2a 100644 (file)
                6FFA5DA021958ECC0001E2F7 /* ErrorNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */; };
                6FFA5DA42197085D0001E2F7 /* ActivateOnDemandOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFA5DA32197085D0001E2F7 /* ActivateOnDemandOption.swift */; };
                6FFACD2021E4D8D500E9A2A5 /* ParseError+WireGuardAppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFACD1E21E4D89600E9A2A5 /* ParseError+WireGuardAppError.swift */; };
+               A625F05529C4C627005EF23D /* GetPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A625F05029C4C627005EF23D /* GetPeers.swift */; };
                A64A79DC27A5411700F15B34 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF3526E21C23FA10008484E /* Logger.swift */; };
                A64A79DD27A5411E00F15B34 /* ringlogger.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FF3526C21C23F960008484E /* ringlogger.c */; };
                A64A79DE27A541F500F15B34 /* TunnelsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774EE21722D97006A79B3 /* TunnelsManager.swift */; };
                A6B8051C27A44F770088E750 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6B8051B27A44F770088E750 /* Intents.framework */; };
                A6B8051F27A44F770088E750 /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6B8051E27A44F770088E750 /* IntentHandler.swift */; };
                A6B8052327A44F770088E750 /* WireGuardIntentsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A6B8051A27A44F770088E750 /* WireGuardIntentsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+               A6E361F829D8758500FFF234 /* AppIntents.strings in Resources */ = {isa = PBXBuildFile; fileRef = A6E361F729D8758500FFF234 /* AppIntents.strings */; };
+               A6E361FE29D9B18C00FFF234 /* TunnelsOptionsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6E361FD29D9B18C00FFF234 /* TunnelsOptionsProvider.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
                6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorNotifier.swift; sourceTree = "<group>"; };
                6FFA5DA32197085D0001E2F7 /* ActivateOnDemandOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivateOnDemandOption.swift; sourceTree = "<group>"; };
                6FFACD1E21E4D89600E9A2A5 /* ParseError+WireGuardAppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ParseError+WireGuardAppError.swift"; sourceTree = "<group>"; };
+               A625F05029C4C627005EF23D /* GetPeers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetPeers.swift; sourceTree = "<group>"; };
                A64A79D727A462FC00F15B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
                A64A79D827A48A8E00F15B34 /* WireGuardIntentsExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuardIntentsExtension-Bridging-Header.h"; sourceTree = "<group>"; };
                A64A79F827A5462900F15B34 /* Intents.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Intents.intentdefinition; sourceTree = "<group>"; };
                A6B8051B27A44F770088E750 /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; };
                A6B8051E27A44F770088E750 /* IntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentHandler.swift; sourceTree = "<group>"; };
                A6B8052727A454150088E750 /* WireGuardIntentsExtension_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuardIntentsExtension_iOS.entitlements; sourceTree = "<group>"; };
+               A6E361F729D8758500FFF234 /* AppIntents.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = AppIntents.strings; sourceTree = "<group>"; };
+               A6E361FD29D9B18C00FFF234 /* TunnelsOptionsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelsOptionsProvider.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                6FF4AC0B211EC46F002C96EB = {
                        isa = PBXGroup;
                        children = (
+                               A625F04C29C4C627005EF23D /* WireguardAppIntents */,
                                6F70E20C221058DF008BDFB4 /* InfoPlist.strings */,
                                6FE1765421C90BBE002690EA /* Localizable.strings */,
                                6F5D0C432183B4A4000F85AD /* Shared */,
                        name = Frameworks;
                        sourceTree = "<group>";
                };
+               A625F04C29C4C627005EF23D /* WireguardAppIntents */ = {
+                       isa = PBXGroup;
+                       children = (
+                               A625F05029C4C627005EF23D /* GetPeers.swift */,
+                               A6E361F729D8758500FFF234 /* AppIntents.strings */,
+                               A6E361FD29D9B18C00FFF234 /* TunnelsOptionsProvider.swift */,
+                       );
+                       name = WireguardAppIntents;
+                       path = Sources/WireguardAppIntents;
+                       sourceTree = "<group>";
+               };
                A6B8051D27A44F770088E750 /* WireGuardIntentsExtension */ = {
                        isa = PBXGroup;
                        children = (
                                6FE1765621C90BBE002690EA /* Localizable.strings in Resources */,
                                6FF4AC22211EC472002C96EB /* LaunchScreen.storyboard in Resources */,
                                6F919EDA218C65C50023B400 /* wireguard_doc_logo_44x58.png in Resources */,
+                               A6E361F829D8758500FFF234 /* AppIntents.strings in Resources */,
                                6FF4AC1F211EC472002C96EB /* Assets.xcassets in Resources */,
                                6F919EDB218C65C50023B400 /* wireguard_doc_logo_64x64.png in Resources */,
                                6F919EDC218C65C50023B400 /* wireguard_doc_logo_320x320.png in Resources */,
                                6FDB6D18224CC05A00EE4BC3 /* LogViewController.swift in Sources */,
                                6FFA5D952194454A0001E2F7 /* NETunnelProviderProtocol+Extension.swift in Sources */,
                                5F4541A921C451D100994C13 /* TunnelStatus.swift in Sources */,
+                               A625F05529C4C627005EF23D /* GetPeers.swift in Sources */,
                                6F8F0D7422267AD2000E8335 /* ChevronCell.swift in Sources */,
                                6F61F1E921B932F700483816 /* WireGuardAppError.swift in Sources */,
+                               A6E361FE29D9B18C00FFF234 /* TunnelsOptionsProvider.swift in Sources */,
                                6F7774E2217181B1006A79B3 /* AppDelegate.swift in Sources */,
                                6FDEF80021863C0100D8FBF6 /* ioapi.c in Sources */,
                                6F7F7E5F21C7D74B00527607 /* TunnelErrors.swift in Sources */,