From: Alessio Nossa Date: Tue, 11 Apr 2023 15:29:52 +0000 (+0200) Subject: Implement GetPeers AppIntent X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bee5d346b1d1c17ac0363d5949c0a039d62ce000;p=thirdparty%2Fwireguard-apple.git Implement GetPeers AppIntent Signed-off-by: Alessio Nossa --- diff --git a/Sources/WireGuardApp/UI/iOS/AppDelegate.swift b/Sources/WireGuardApp/UI/iOS/AppDelegate.swift index 45ffa2b..d8629c4 100644 --- a/Sources/WireGuardApp/UI/iOS/AppDelegate.swift +++ b/Sources/WireGuardApp/UI/iOS/AppDelegate.swift @@ -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 index 0000000..e539499 --- /dev/null +++ b/Sources/WireguardAppIntents/AppIntents.strings @@ -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 index 0000000..ce6849e --- /dev/null +++ b/Sources/WireguardAppIntents/GetPeers.swift @@ -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 index 0000000..a21109c --- /dev/null +++ b/Sources/WireguardAppIntents/TunnelsOptionsProvider.swift @@ -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 + } +} diff --git a/WireGuard.xcodeproj/project.pbxproj b/WireGuard.xcodeproj/project.pbxproj index 53db590..e7ad37b 100644 --- a/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard.xcodeproj/project.pbxproj @@ -205,6 +205,7 @@ 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 */; }; @@ -239,6 +240,8 @@ 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 */ @@ -480,6 +483,7 @@ 6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorNotifier.swift; sourceTree = ""; }; 6FFA5DA32197085D0001E2F7 /* ActivateOnDemandOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivateOnDemandOption.swift; sourceTree = ""; }; 6FFACD1E21E4D89600E9A2A5 /* ParseError+WireGuardAppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ParseError+WireGuardAppError.swift"; sourceTree = ""; }; + A625F05029C4C627005EF23D /* GetPeers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetPeers.swift; sourceTree = ""; }; A64A79D727A462FC00F15B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A64A79D827A48A8E00F15B34 /* WireGuardIntentsExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuardIntentsExtension-Bridging-Header.h"; sourceTree = ""; }; A64A79F827A5462900F15B34 /* Intents.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Intents.intentdefinition; sourceTree = ""; }; @@ -488,6 +492,8 @@ 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 = ""; }; A6B8052727A454150088E750 /* WireGuardIntentsExtension_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuardIntentsExtension_iOS.entitlements; sourceTree = ""; }; + A6E361F729D8758500FFF234 /* AppIntents.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = AppIntents.strings; sourceTree = ""; }; + A6E361FD29D9B18C00FFF234 /* TunnelsOptionsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelsOptionsProvider.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -820,6 +826,7 @@ 6FF4AC0B211EC46F002C96EB = { isa = PBXGroup; children = ( + A625F04C29C4C627005EF23D /* WireguardAppIntents */, 6F70E20C221058DF008BDFB4 /* InfoPlist.strings */, 6FE1765421C90BBE002690EA /* Localizable.strings */, 6F5D0C432183B4A4000F85AD /* Shared */, @@ -874,6 +881,17 @@ name = Frameworks; sourceTree = ""; }; + A625F04C29C4C627005EF23D /* WireguardAppIntents */ = { + isa = PBXGroup; + children = ( + A625F05029C4C627005EF23D /* GetPeers.swift */, + A6E361F729D8758500FFF234 /* AppIntents.strings */, + A6E361FD29D9B18C00FFF234 /* TunnelsOptionsProvider.swift */, + ); + name = WireguardAppIntents; + path = Sources/WireguardAppIntents; + sourceTree = ""; + }; A6B8051D27A44F770088E750 /* WireGuardIntentsExtension */ = { isa = PBXGroup; children = ( @@ -1193,6 +1211,7 @@ 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 */, @@ -1524,8 +1543,10 @@ 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 */,