diff --git a/Apple/App/App-macOS.entitlements b/Apple/App/App-macOS.entitlements index 02ee960..1c1e0ea 100644 --- a/Apple/App/App-macOS.entitlements +++ b/Apple/App/App-macOS.entitlements @@ -8,7 +8,7 @@ com.apple.security.application-groups - $(APP_GROUP_IDENTIFIER) + group.com.hackclub.burrow diff --git a/Apple/App/BurrowApp.swift b/Apple/App/BurrowApp.swift index 50a7231..59907f8 100644 --- a/Apple/App/BurrowApp.swift +++ b/Apple/App/BurrowApp.swift @@ -4,14 +4,50 @@ import SwiftUI @main @MainActor struct BurrowApp: App { + //To connect to the App Delegate + @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate + + + var body: some Scene { + WindowGroup { + TunnelView() + } + } +} + + +@MainActor +class AppDelegate: NSObject, NSApplicationDelegate { + static let tunnel = Tunnel { manager, proto in proto.serverAddress = "hackclub.com" manager.localizedDescription = "Burrow" } - var body: some Scene { - WindowGroup { - TunnelView(tunnel: Self.tunnel) + var statusItem: NSStatusItem? + var popOver = NSPopover() + func applicationDidFinishLaunching(_ notification: Notification) { + let menuView = MenuView(tunnel: AppDelegate.tunnel) + // Creating apopOver + popOver.behavior = .transient + popOver.animates = true + popOver.contentViewController = NSViewController() + popOver.contentViewController?.view = NSHostingView(rootView: menuView) + statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + // Safe Check if status Button is Available or not... + if let menuButton = statusItem?.button { + let icon = "network.badge.shield.half.filled" + menuButton.image = NSImage(systemSymbolName: icon, accessibilityDescription: nil) + menuButton.action = #selector(menuButtonToggle) + } + } + @objc func menuButtonToggle() { + + + if let menuButton = statusItem?.button { + + self.popOver.show(relativeTo: menuButton.bounds, of: menuButton, preferredEdge: NSRectEdge.minY) } } } + diff --git a/Apple/App/Menu/MenuView.swift b/Apple/App/Menu/MenuView.swift new file mode 100644 index 0000000..62abd66 --- /dev/null +++ b/Apple/App/Menu/MenuView.swift @@ -0,0 +1,69 @@ +// +// MenuView.swift +// App +// +// Created by Thomas Stubblefield on 5/13/23. +// + +import SwiftUI + +struct MenuView: View { + @State private var isToggled = false + @ObservedObject var tunnel: Tunnel + + private func start() { + + do { + try tunnel.start() + } catch { + print(error) + } + } + + private func stop() { + tunnel.stop() + } + + private func configure() { + Task { try await tunnel.configure() } + } + + var body: some View { + VStack { + HStack { + Text("Burrow") + .fontWeight(.bold) + + Spacer() + Toggle("", isOn: $isToggled) + .toggleStyle(SwitchToggleStyle(tint: .blue)) + .onChange(of: isToggled) { value in + if value { + start() + } else { + stop() + } + print("Toggle value: \(value)") + } + } + Divider() + switch tunnel.status { + case .permissionRequired: + VStack(alignment: .leading) { + Text("Burrow requires additional permissions to function optimally on your machine. Please grant the necessary permissions to ensure smooth operation.") + .font(.caption) + .truncationMode(.tail) + + Button("Grant Permissions", action: configure) + } + default: + + Text("Burrow is equipped with the necessary permissions to operate seamlessly on your device.") + .font(.caption) + } + } + .frame(width: 250) + .padding(16) + .task { await tunnel.update() } + } +} diff --git a/Apple/App/Status.swift b/Apple/App/Status.swift index c08cdd1..8c325eb 100644 --- a/Apple/App/Status.swift +++ b/Apple/App/Status.swift @@ -2,6 +2,7 @@ import Foundation import NetworkExtension extension Tunnel { + enum Status: CustomStringConvertible, Equatable, Hashable { case unknown case permissionRequired diff --git a/Apple/App/Tunnel.swift b/Apple/App/Tunnel.swift index ae185a4..e8bff22 100644 --- a/Apple/App/Tunnel.swift +++ b/Apple/App/Tunnel.swift @@ -92,7 +92,7 @@ class Tunnel: ObservableObject { let proto = NETunnelProviderProtocol() proto.providerBundleIdentifier = bundleIdentifier configure(manager, proto) - + manager.protocolConfiguration = proto try await manager.save() } diff --git a/Apple/App/TunnelView.swift b/Apple/App/TunnelView.swift index 6692a04..e3b9e28 100644 --- a/Apple/App/TunnelView.swift +++ b/Apple/App/TunnelView.swift @@ -1,35 +1,36 @@ import SwiftUI struct TunnelView: View { - @ObservedObject var tunnel: Tunnel +// @ObservedObject var tunnel: Tunnel var body: some View { - VStack { - Text(verbatim: tunnel.status.description) - switch tunnel.status { - case .connected: - Button("Disconnect", action: stop) - case .permissionRequired: - Button("Allow", action: configure) - case .disconnected: - Button("Start", action: start) - default: - EmptyView() - } - } - .task { await tunnel.update() } - .padding() + EmptyView() +// VStack { +// Text(verbatim: tunnel.status.description) +// switch tunnel.status { +// case .connected: +// Button("Disconnect", action: stop) +// case .permissionRequired: +// Button("Allow", action: configure) +// case .disconnected: +// Button("Start", action: start) +// default: +// EmptyView() +// } +// } +// .task { await tunnel.update() } +// .padding() } - private func start() { - try? tunnel.start() - } - - private func stop() { - tunnel.stop() - } - - private func configure() { - Task { try await tunnel.configure() } - } +// private func start() { +// try? tunnel.start() +// } +// +// private func stop() { +// tunnel.stop() +// } +// +// private func configure() { +// Task { try await tunnel.configure() } +// } } diff --git a/Apple/Burrow.xcodeproj/project.pbxproj b/Apple/Burrow.xcodeproj/project.pbxproj index 56b64e4..6fa5aae 100644 --- a/Apple/Burrow.xcodeproj/project.pbxproj +++ b/Apple/Burrow.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; }; D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; }; D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; }; @@ -44,6 +45,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = ""; }; D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = ""; }; D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = ""; }; D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -90,6 +92,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 43AA26D62A0FFFD000F14CE6 /* Menu */ = { + isa = PBXGroup; + children = ( + 43AA26D72A10004900F14CE6 /* MenuView.swift */, + ); + path = Menu; + sourceTree = ""; + }; D020F63C29E4A1FF002790F6 /* Configuration */ = { isa = PBXGroup; children = ( @@ -137,6 +147,7 @@ D05B9F7429E39EEC008CB1F9 /* App */ = { isa = PBXGroup; children = ( + 43AA26D62A0FFFD000F14CE6 /* Menu */, D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */, D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */, D0B98FC629FDC5B5004E7149 /* Tunnel.swift */, @@ -299,6 +310,7 @@ buildActionMask = 2147483647; files = ( D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */, + 43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */, D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */, D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */, D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */, @@ -329,6 +341,10 @@ isa = XCBuildConfiguration; baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */; buildSettings = { + DEVELOPMENT_TEAM = P6PV2R9443; + INFOPLIST_KEY_CFBundleDisplayName = Burrow; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club"; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.hackclub.burrow.network; }; name = Debug; }; @@ -336,6 +352,10 @@ isa = XCBuildConfiguration; baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */; buildSettings = { + DEVELOPMENT_TEAM = P6PV2R9443; + INFOPLIST_KEY_CFBundleDisplayName = Burrow; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club"; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.hackclub.burrow.network; }; name = Release; }; diff --git a/Apple/NetworkExtension/Info.plist b/Apple/NetworkExtension/Info.plist index e2cf604..3059459 100644 --- a/Apple/NetworkExtension/Info.plist +++ b/Apple/NetworkExtension/Info.plist @@ -2,8 +2,6 @@ - CFBundleName - $(INFOPLIST_KEY_CFBundleDisplayName) NSExtension NSExtensionPointIdentifier diff --git a/Apple/NetworkExtension/NetworkExtension-macOS.entitlements b/Apple/NetworkExtension/NetworkExtension-macOS.entitlements index 02ee960..1c1e0ea 100644 --- a/Apple/NetworkExtension/NetworkExtension-macOS.entitlements +++ b/Apple/NetworkExtension/NetworkExtension-macOS.entitlements @@ -8,7 +8,7 @@ com.apple.security.application-groups - $(APP_GROUP_IDENTIFIER) + group.com.hackclub.burrow