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