Compare commits

..

No commits in common. "30886771c5b10fde5f09ff2493e1e07713f118ee" and "efee4afc8d84e417a27e683aec38071a51fa17dc" have entirely different histories.

13 changed files with 43 additions and 258 deletions

3
.gitignore vendored
View file

@ -3,6 +3,3 @@ xcuserdata
# Rust # Rust
target/ target/
# DS Store
**/.DS_Store

View file

@ -8,7 +8,7 @@
</array> </array>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>group.com.hackclub.burrow</string> <string>$(APP_GROUP_IDENTIFIER)</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View file

@ -1,21 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "background.jpeg",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

View file

@ -1,62 +1,17 @@
import NetworkExtension import NetworkExtension
import SwiftUI import SwiftUI
@available(macOS 13.0, *)
@main @main
@MainActor @MainActor
struct BurrowApp: App { struct BurrowApp: App {
// To connect to the App Delegate
@NSApplicationDelegateAdaptor(AppDelegate.self)
var delegate
var body: some Scene {
WindowGroup(id: "onboarding", content: {
OnboardingView().frame(width: 1000, height: 600.0).scaledToFill().fixedSize()
}).windowStyle(.hiddenTitleBar).windowResizability(.contentSize)
}
}
@available(macOS 13.0, *)
@MainActor
class AppDelegate: NSObject, NSApplicationDelegate {
static let tunnel = Tunnel { manager, proto in static let tunnel = Tunnel { manager, proto in
proto.serverAddress = "hackclub.com" proto.serverAddress = "hackclub.com"
manager.localizedDescription = "Burrow" manager.localizedDescription = "Burrow"
} }
// Verifies app status var body: some Scene {
func checkFirstTime() { WindowGroup {
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") TunnelView(tunnel: Self.tunnel)
if launchedBefore {
print("Not first launch.")
closeApp()
} else {
print("First launch, setting UserDefault.")
setVisited()
}
}
var statusItem: NSStatusItem?
var popOver = NSPopover()
func applicationDidFinishLaunching(_ notification: Notification) {
checkFirstTime()
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)
} }
} }
} }

View file

@ -1,68 +0,0 @@
//
// 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() }
}
}

View file

@ -1,54 +0,0 @@
//
// OnboardingView.swift
// App
//
// Created by Juan Pablo Gutierrez on 25/05/23.
//
// Represents the onboarding screen
import SwiftUI
//Sets burrow visited status
func setVisited() {
UserDefaults.standard.set(true, forKey: "launchedBefore")
}
func closeApp() {
setVisited()
NSApp.windows.first?.close()
}
@available(macOS 13.0, *)
struct OnboardingView: View {
var body: some View {
ZStack(alignment: .center) {
Image("OnboardingBackground")
.resizable(resizingMode: .stretch)
.aspectRatio(contentMode: .fit)
.scaledToFill()
Color.black
.opacity(0.6)
.cornerRadius(15)
.blur(radius: 0.2)
.edgesIgnoringSafeArea(.all)
.frame(width: 450, height: 300)
VStack(alignment: .center) {
Text("Welcome to burrow").font(.system(size: 24, weight: .bold, design: .rounded))
Spacer().frame(height: /*@START_MENU_TOKEN@*/20.0/*@END_MENU_TOKEN@*/)
Text("It is a best-in-class tool for burrowing through firewalls.").font(.system(size: 14))
Spacer().frame(height: 10.0)
Text("Built by teenagers at HackClub").font(.system(size: 14))
Button(action: closeApp, label: {
Text("Start burrowing")
.font(
.system(
size : 14,
weight: .regular,
design: .rounded))
.padding(.all, 30.0)
.foregroundColor(.white)
}).buttonBorderShape(.roundedRectangle).buttonStyle(.borderless)
}.padding(20.0)
}
}
}

View file

@ -1,36 +1,35 @@
import SwiftUI import SwiftUI
struct TunnelView: View { struct TunnelView: View {
// @ObservedObject var tunnel: Tunnel @ObservedObject var tunnel: Tunnel
var body: some View { var body: some View {
EmptyView() VStack {
// VStack { Text(verbatim: tunnel.status.description)
// Text(verbatim: tunnel.status.description) switch tunnel.status {
// switch tunnel.status { case .connected:
// case .connected: Button("Disconnect", action: stop)
// Button("Disconnect", action: stop) case .permissionRequired:
// case .permissionRequired: Button("Allow", action: configure)
// Button("Allow", action: configure) case .disconnected:
// case .disconnected: Button("Start", action: start)
// Button("Start", action: start) default:
// default: EmptyView()
// EmptyView() }
// } }
// } .task { await tunnel.update() }
// .task { await tunnel.update() } .padding()
// .padding()
} }
// private func start() { private func start() {
// try? tunnel.start() try? tunnel.start()
// } }
//
// private func stop() { private func stop() {
// tunnel.stop() tunnel.stop()
// } }
//
// private func configure() { private func configure() {
// Task { try await tunnel.configure() } Task { try await tunnel.configure() }
// } }
} }

View file

@ -7,11 +7,10 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
91D80FC72A20615500952E28 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D80FC62A20615500952E28 /* OnboardingView.swift */; };
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.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, ); }; }; 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 */; }; D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */; };
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; }; D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; };
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; }; D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; };
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FE2A086E1C00AD070D /* Status.swift */; }; D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FE2A086E1C00AD070D /* Status.swift */; };
@ -45,8 +44,6 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
91D80FC62A20615500952E28 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = "<group>"; wrapsLines = 0; };
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; }; D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; }; D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -63,6 +60,7 @@
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; }; D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; }; D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; }; D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelView.swift; sourceTree = "<group>"; };
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; }; D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; }; D0B98FC629FDC5B5004E7149 /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
@ -92,15 +90,6 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
43AA26D62A0FFFD000F14CE6 /* Menu */ = {
isa = PBXGroup;
children = (
43AA26D72A10004900F14CE6 /* MenuView.swift */,
91D80FC62A20615500952E28 /* OnboardingView.swift */,
);
path = Menu;
sourceTree = "<group>";
};
D020F63C29E4A1FF002790F6 /* Configuration */ = { D020F63C29E4A1FF002790F6 /* Configuration */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -148,8 +137,8 @@
D05B9F7429E39EEC008CB1F9 /* App */ = { D05B9F7429E39EEC008CB1F9 /* App */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
43AA26D62A0FFFD000F14CE6 /* Menu */,
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */, D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */,
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */, D0B98FC629FDC5B5004E7149 /* Tunnel.swift */,
D0BCC5FE2A086E1C00AD070D /* Status.swift */, D0BCC5FE2A086E1C00AD070D /* Status.swift */,
D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */, D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */,
@ -310,11 +299,10 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */, D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */,
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */, D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */,
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */, D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */,
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */, D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */, D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */,
91D80FC72A20615500952E28 /* OnboardingView.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -341,10 +329,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */; baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */;
buildSettings = { 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; name = Debug;
}; };
@ -352,10 +336,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */; baseConfigurationReference = D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */;
buildSettings = { 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; name = Release;
}; };
@ -377,10 +357,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */; baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
buildSettings = { buildSettings = {
INFOPLIST_KEY_CFBundleDisplayName = Burrow;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
INFOPLIST_KEY_LSUIElement = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club";
}; };
name = Debug; name = Debug;
}; };
@ -388,10 +364,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */; baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
buildSettings = { buildSettings = {
INFOPLIST_KEY_CFBundleDisplayName = Burrow;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
INFOPLIST_KEY_LSUIElement = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club";
}; };
name = Release; name = Release;
}; };

View file

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict/> <dict>
<key>CFBundleName</key>
<string>$(INFOPLIST_KEY_CFBundleDisplayName)</string>
</dict>
</plist> </plist>

View file

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleName</key>
<string>$(INFOPLIST_KEY_CFBundleDisplayName)</string>
<key>NSExtension</key> <key>NSExtension</key>
<dict> <dict>
<key>NSExtensionPointIdentifier</key> <key>NSExtensionPointIdentifier</key>

View file

@ -8,7 +8,7 @@
</array> </array>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>group.com.hackclub.burrow</string> <string>$(APP_GROUP_IDENTIFIER)</string>
</array> </array>
</dict> </dict>
</plist> </plist>