Skip to content

Commit b008762

Browse files
JettChenTconradev
authored andcommitted
Implement Wireguard
Implements Wireguard
1 parent 60257b2 commit b008762

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+3815
-520
lines changed

.github/workflows/build-rust.yml

+4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ jobs:
5454
run: |
5555
sudo apt-get update
5656
sudo apt-get install -y ${{ join(matrix.packages, ' ') }}
57+
- name: Install Windows Deps
58+
if: matrix.os == 'windows-2022'
59+
shell: bash
60+
run: echo "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\Llvm\x64\bin" >> $GITHUB_PATH
5761
- name: Install Rust
5862
uses: dtolnay/rust-toolchain@stable
5963
with:

.rustfmt.toml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
condense_wildcard_suffixes = true
2+
format_macro_matchers = true
3+
imports_layout = "HorizontalVertical"
4+
imports_granularity = "Crate"
5+
newline_style = "Unix"
6+
overflow_delimited_expr = true
7+
reorder_impl_items = true
8+
group_imports = "StdExternalCrate"
9+
trailing_semicolon = false
10+
use_field_init_shorthand = true
11+
use_try_shorthand = true
12+
struct_lit_width = 30

.vscode/settings.json

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
"editor.acceptSuggestionOnEnter": "on",
99
"rust-analyzer.restartServerOnConfigChange": true,
1010
"rust-analyzer.cargo.features": "all",
11+
"rust-analyzer.rustfmt.extraArgs": [
12+
"+nightly"
13+
],
1114
"[rust]": {
1215
"editor.defaultFormatter": "rust-lang.rust-analyzer",
1316
}

Apple/Burrow.xcodeproj/project.pbxproj

-1
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@
251251
);
252252
mainGroup = D05B9F6929E39EEC008CB1F9;
253253
packageReferences = (
254-
D0BCC6102A0B327700AD070D /* XCRemoteSwiftPackageReference "SwiftLint" */,
255254
);
256255
productRefGroup = D05B9F7329E39EEC008CB1F9 /* Products */;
257256
projectDirPath = "";

Apple/Burrow.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

-77
This file was deleted.

Apple/NetworkExtension/BurrowIpc.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ final class BurrowIpc {
113113
return data
114114
}
115115

116-
func request<U: Decodable>(_ request: Request, type: U.Type) async throws -> U {
116+
func request<U: Decodable>(_ request: any Request, type: U.Type) async throws -> U {
117117
do {
118118
var data: Data = try JSONEncoder().encode(request)
119119
data.append(contentsOf: [10])

Apple/NetworkExtension/DataTypes.swift

+31-4
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,55 @@
11
import Foundation
22

3+
// swiftlint:disable identifier_name
34
enum BurrowError: Error {
45
case addrDoesntExist
56
case resultIsError
67
case cantParseResult
78
case resultIsNone
89
}
910

10-
protocol Request: Codable {
11+
protocol Request: Codable where CommandT: Codable {
12+
associatedtype CommandT
1113
var id: UInt { get set }
12-
var command: String { get set }
14+
var command: CommandT { get set }
1315
}
1416

15-
struct BurrowRequest: Request {
17+
struct BurrowSingleCommand: Request {
1618
var id: UInt
1719
var command: String
1820
}
1921

22+
struct BurrowRequest<T>: Request where T: Codable {
23+
var id: UInt
24+
var command: T
25+
}
26+
27+
struct BurrowStartRequest: Codable {
28+
struct TunOptions: Codable {
29+
let name: String?
30+
let no_pi: Bool
31+
let tun_excl: Bool
32+
let tun_retrieve: Bool
33+
let address: String?
34+
}
35+
struct StartOptions: Codable {
36+
let tun: TunOptions
37+
}
38+
let Start: StartOptions
39+
}
40+
41+
func start_req_fd(id: UInt) -> BurrowRequest<BurrowStartRequest> {
42+
let command = BurrowStartRequest(Start: BurrowStartRequest.StartOptions(
43+
tun: BurrowStartRequest.TunOptions(name: nil, no_pi: false, tun_excl: false, tun_retrieve: true, address: nil)
44+
))
45+
return BurrowRequest(id: id, command: command)
46+
}
47+
2048
struct Response<T>: Decodable where T: Decodable {
2149
var id: UInt
2250
var result: T
2351
}
2452

25-
// swiftlint:disable identifier_name
2653
struct BurrowResult<T>: Codable where T: Codable {
2754
var Ok: T?
2855
var Err: String?

Apple/NetworkExtension/NetworkExtension-macOS.entitlements

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<dict>
55
<key>com.apple.security.network.client</key>
66
<true/>
7+
<key>com.apple.security.network.server</key>
8+
<true/>
79
<key>com.apple.developer.networking.networkextension</key>
810
<array>
911
<string>packet-tunnel-provider</string>

Apple/NetworkExtension/PacketTunnelProvider.swift

+33-30
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
66
let logger = Logger(subsystem: "com.hackclub.burrow", category: "frontend")
77
var client: BurrowIpc?
88
var osInitialized = false
9-
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
9+
override func startTunnel(options: [String: NSObject]? = nil) async throws {
1010
logger.log("Starting tunnel")
1111
if !osInitialized {
1212
libburrow.initialize_oslog()
@@ -15,28 +15,35 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
1515
libburrow.start_srv()
1616
client = BurrowIpc(logger: logger)
1717
logger.info("Started server")
18-
Task {
19-
do {
20-
let command = BurrowRequest(id: 0, command: "ServerConfig")
21-
guard let data = try await client?.request(command, type: Response<BurrowResult<ServerConfigData>>.self)
22-
else {
23-
throw BurrowError.cantParseResult
24-
}
25-
let encoded = try JSONEncoder().encode(data.result)
26-
self.logger.log("Received final data: \(String(decoding: encoded, as: UTF8.self))")
27-
guard let serverconfig = data.result.Ok else {
28-
throw BurrowError.resultIsError
29-
}
30-
guard let tunNs = self.generateTunSettings(from: serverconfig) else {
31-
throw BurrowError.addrDoesntExist
32-
}
33-
try await self.setTunnelNetworkSettings(tunNs)
34-
self.logger.info("Set remote tunnel address to \(tunNs.tunnelRemoteAddress)")
35-
completionHandler(nil)
36-
} catch {
37-
self.logger.error("An error occurred: \(error)")
38-
completionHandler(error)
18+
do {
19+
let command = BurrowSingleCommand(id: 0, command: "ServerConfig")
20+
guard let data = try await client?.request(command, type: Response<BurrowResult<ServerConfigData>>.self)
21+
else {
22+
throw BurrowError.cantParseResult
3923
}
24+
let encoded = try JSONEncoder().encode(data.result)
25+
self.logger.log("Received final data: \(String(decoding: encoded, as: UTF8.self))")
26+
guard let serverconfig = data.result.Ok else {
27+
throw BurrowError.resultIsError
28+
}
29+
guard let tunNs = self.generateTunSettings(from: serverconfig) else {
30+
throw BurrowError.addrDoesntExist
31+
}
32+
try await self.setTunnelNetworkSettings(tunNs)
33+
self.logger.info("Set remote tunnel address to \(tunNs.tunnelRemoteAddress)")
34+
35+
// let tunFd = self.packetFlow.value(forKeyPath: "socket.fileDescriptor") as! Int;
36+
// self.logger.info("Found File Descriptor: \(tunFd)")
37+
let startCommand = start_req_fd(id: 1)
38+
guard let data = try await client?.request(startCommand, type: Response<BurrowResult<String>>.self)
39+
else {
40+
throw BurrowError.cantParseResult
41+
}
42+
let encodedStartRes = try JSONEncoder().encode(data.result)
43+
self.logger.log("Received start server response: \(String(decoding: encodedStartRes, as: UTF8.self))")
44+
} catch {
45+
self.logger.error("An error occurred: \(error)")
46+
throw error
4047
}
4148
}
4249
private func generateTunSettings(from: ServerConfigData) -> NETunnelNetworkSettings? {
@@ -50,16 +57,12 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
5057
logger.log("Initialized ipv4 settings: \(nst.ipv4Settings)")
5158
return nst
5259
}
53-
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
54-
completionHandler()
60+
override func stopTunnel(with reason: NEProviderStopReason) async {
5561
}
56-
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
57-
if let handler = completionHandler {
58-
handler(messageData)
59-
}
62+
override func handleAppMessage(_ messageData: Data) async -> Data? {
63+
messageData
6064
}
61-
override func sleep(completionHandler: @escaping () -> Void) {
62-
completionHandler()
65+
override func sleep() async {
6366
}
6467
override func wake() {
6568
}

0 commit comments

Comments
 (0)