started setting up the VPN status & checking for permissions

This commit is contained in:
SerenityUX 2023-04-29 12:54:54 -04:00
parent 5ae3d37243
commit 42590eaf00
12 changed files with 140 additions and 19 deletions

View file

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>$(APP_GROUP_IDENTIFIER)</string>

View file

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>$(APP_GROUP_IDENTIFIER)</string>

View file

@ -0,0 +1,14 @@
#if os(macOS)
import AppKit
import FluidMenuBarExtra
class AppDelegate: NSObject, NSApplicationDelegate {
private var menuBarExtra: FluidMenuBarExtra?
func applicationDidFinishLaunching(_ notification: Notification) {
self.menuBarExtra = FluidMenuBarExtra(title: "Burrow", systemImage: "network.badge.shield.half.filled") {
ContentView()
}
}
}
#endif

View file

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "sampleNetworkIcon.png",
"filename" : "hackClubLogo.png",
"idiom" : "universal",
"scale" : "1x"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

View file

@ -6,24 +6,32 @@
//
import SwiftUI
import FluidMenuBarExtra
import NetworkExtension
@main
struct burrowBarApp: App {
#if os(macOS)
@NSApplicationDelegateAdaptor private var appDelegate: AppDelegate
#endif
var body: some Scene {
Settings {
Text("Burrow")
WindowGroup {
PermissionView()
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
private var menuBarExtra: FluidMenuBarExtra?
struct PermissionView: View {
@ObservedObject
var configuration = NetworkConfiguration()
func applicationDidFinishLaunching(_ notification: Notification) {
self.menuBarExtra = FluidMenuBarExtra(title: "Burrow", systemImage: "network.badge.shield.half.filled") {
ContentView()
var body: some View {
VStack {
Text(verbatim: "Status is \(configuration.status)")
}
.onAppear {
configuration.update()
}
}
}

View file

@ -1,39 +1,41 @@
import SwiftUI
struct ContentView: View {
@State private var connectedHackClubNetwork = false
var body: some View {
VStack(alignment: .leading) {
HStack {
Text("Networks")
.font(.title3)
Spacer()
Image(systemName: "badge.plus.radiowaves.forward")
.symbolRenderingMode(.palette)
.foregroundStyle(.blue, .black)
.opacity(0.4)
.imageScale(.large) }
Divider()
VStack(alignment: .leading) {
Text("Your Burrows")
Text("Burrows")
.padding(.top, 2)
.font(.subheadline)
.fontWeight(.bold)
.font(.subheadline.weight(.bold))
HStack {
Image("sampleNetworkIcon")
Image("hackClubLogo")
.resizable()
.frame(width: 32, height: 32)
.cornerRadius(100)
VStack(alignment: .leading) {
Text("Penguin Pair Burrow")
Text("Hack Club Network")
.fontWeight(.medium)
Text("􁠲 Recently Validated Certificate")
.font(.caption2)
.foregroundColor(.blue)
}.onTapGesture {
connectedHackClubNetwork = true
}
}
}

View file

@ -0,0 +1,81 @@
import SwiftUI
import NetworkExtension
@MainActor
class NetworkConfiguration: ObservableObject {
enum Status: CustomStringConvertible {
case unknown
case blank
case valid
case error
var description: String {
switch self {
case .unknown:
return "Unknown"
case .blank:
return "Blank"
case .valid:
return "Valid"
default:
return "Default"
}
}
}
@Published
var status: Status = .unknown
init() {
update()
}
func update() {
Task {
do {
let configurations = try await NETunnelProviderManager.loadAll()
await MainActor.run {
self.status = configurations.isEmpty ? .blank : .valid
print(self.status)
self.objectWillChange.send()
}
} catch {
await MainActor.run {
self.status = .error
self.objectWillChange.send()
}
}
}
}
func request() {
let configuration = NETunnelProviderProtocol()
configuration.providerBundleIdentifier = ""
configuration.serverAddress = "Hack Club"
let manager = NETunnelProviderManager()
manager.protocolConfiguration = configuration
manager.localizedDescription = "Hack Club Burrow"
manager.saveToPreferences { error in
print(error)
}
}
}
extension NETunnelProviderManager {
static func loadAll() async throws -> [NETunnelProviderManager] {
try await withUnsafeThrowingContinuation { continuation in
NETunnelProviderManager.loadAllFromPreferences { managers, error in
if let error = error {
continuation.resume(throwing: error)
} else {
continuation.resume(returning: managers ?? [])
}
}
}
}
}