diff --git a/Apple/Burrow.xcodeproj/project.pbxproj b/Apple/Burrow.xcodeproj/project.pbxproj index ec08d2b..f9c7454 100644 --- a/Apple/Burrow.xcodeproj/project.pbxproj +++ b/Apple/Burrow.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */; }; 43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; }; D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; }; D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; }; @@ -47,7 +46,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettingsConverter.swift; sourceTree = ""; }; 43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = ""; }; D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = ""; }; @@ -120,7 +118,6 @@ isa = PBXGroup; children = ( D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */, - 0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */, D020F65929E4A697002790F6 /* Info.plist */, D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */, D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */, @@ -307,7 +304,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */, D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Apple/NetworkExtension/NetworkSettingsConverter.swift b/Apple/NetworkExtension/NetworkSettingsConverter.swift deleted file mode 100644 index bf17c55..0000000 --- a/Apple/NetworkExtension/NetworkSettingsConverter.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// NetworkSettingsConverter.swift -// NetworkExtension -// -// Created by Jett Chen on 2023/7/7. -// - -import Foundation -import NetworkExtension - -public struct TunCrateNetworkSettings { - let addr: Int64 - let netmask: Int64 - let mtu: Int32 -} - -extension TunCrateNetworkSettings { - var decodedIPv4Addr: String? { - return decodeIPv4(addr) - } - - var decodedIPv4Netmask: String? { - return decodeIPv4(netmask) - } - - var decodedMTU: Int? { - return mtu >= 0 ? Int(mtu) : nil - } - - private func decodeIPv4(_ addr: Int64) -> String? { - if addr < 0 { - return nil - } - let bytes = ( - UInt8((addr & 0xFF000000) >> 24), - UInt8((addr & 0x00FF0000) >> 16), - UInt8((addr & 0x0000FF00) >> 8), - UInt8(addr & 0x000000FF) - ) - return "\(bytes.0).\(bytes.1).\(bytes.2).\(bytes.3)" - } - - func generateNetworkSettings() -> NEPacketTunnelNetworkSettings { - let neSettings = NEPacketTunnelNetworkSettings() - - if let addr = decodedIPv4Addr, let netmask = decodedIPv4Netmask { - neSettings.ipv4Settings = NEIPv4Settings(addresses: [addr], subnetMasks: [netmask]) - } - if let mtuValue = decodedMTU { - neSettings.mtu = NSNumber(value: mtuValue) - } - return neSettings - } - -} - diff --git a/Apple/NetworkExtension/PacketTunnelProvider.swift b/Apple/NetworkExtension/PacketTunnelProvider.swift index 23b8606..5ca4e93 100644 --- a/Apple/NetworkExtension/PacketTunnelProvider.swift +++ b/Apple/NetworkExtension/PacketTunnelProvider.swift @@ -4,15 +4,19 @@ import OSLog class PacketTunnelProvider: NEPacketTunnelProvider { let logger = Logger(subsystem: "com.hackclub.burrow", category: "General") - var osInitialized = false - override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { - if(!osInitialized){ - libburrow.initialize_oslog() - osInitialized=true + let fild = libburrow.retrieve() + if fild == -1 { + // Not sure if this is the right way to return an error + logger.error("Failed to retrieve file descriptor for burrow.") + let err = NSError( + domain: "com.hackclub.burrow", + code: 1_010, + userInfo: [NSLocalizedDescriptionKey: "Failed to find TunInterface"] + ) + completionHandler(err) } - libburrow.spawn_server() - logger.debug("spawned server") + logger.info("fd: \(fild)") completionHandler(nil) } @@ -20,14 +24,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler() } - func genNetSec(fild: Int32) -> NEPacketTunnelNetworkSettings { - logger.debug("getting Network settings with fild \(fild) ...") - let settings = libburrow.getNetworkSettings(fild) - logger.debug("genNetSec Called: \n ipv4: \(settings.ipv4_addr) \n netmask: \(settings.ipv4_netmask) \n mtu: \(settings.mtu)") - let tNetworksettings = TunCrateNetworkSettings(addr: settings.ipv4_addr, netmask: settings.ipv4_netmask, mtu: settings.mtu) - return tNetworksettings.generateNetworkSettings() - } - override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) { if let handler = completionHandler { handler(messageData) diff --git a/Apple/NetworkExtension/libburrow/libburrow.h b/Apple/NetworkExtension/libburrow/libburrow.h index eba6198..1057c90 100644 --- a/Apple/NetworkExtension/libburrow/libburrow.h +++ b/Apple/NetworkExtension/libburrow/libburrow.h @@ -1,12 +1 @@ -#include int retrieve(); - -typedef struct { - int64_t ipv4_addr; - int64_t ipv4_netmask; - int32_t mtu; -} NetWorkSettings; - -NetWorkSettings getNetworkSettings(int); -void initialize_oslog(); -void spawn_server(); diff --git a/Cargo.lock b/Cargo.lock index 72e9c1b..146bbc5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,15 +29,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.3.2" @@ -93,96 +84,12 @@ version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" -[[package]] -name = "async-trait" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2d0f03b3640e3a630367e40c468cb7f309529c708ed1d88597047b0e7c6ef7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core", - "axum-macros", - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-macros" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.29", -] - [[package]] name = "base64" version = "0.21.0" @@ -195,29 +102,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "clap 2.34.0", - "env_logger 0.9.3", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - [[package]] name = "bindgen" version = "0.65.1" @@ -237,7 +121,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.29", + "syn 2.0.15", "which", ] @@ -266,18 +150,12 @@ checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" name = "burrow" version = "0.1.0" dependencies = [ - "axum", "caps", - "clap 4.3.2", - "env_logger 0.10.0", + "clap", + "env_logger", "log", "nix", - "serde", - "serde_json", "tokio", - "tracing", - "tracing-oslog", - "tracing-subscriber", "tun", ] @@ -368,21 +246,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - [[package]] name = "clap" version = "4.3.2" @@ -404,7 +267,7 @@ dependencies = [ "anstyle", "bitflags", "clap_lex", - "strsim 0.10.0", + "strsim", ] [[package]] @@ -416,7 +279,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] @@ -516,19 +379,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.0" @@ -688,7 +538,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] @@ -768,15 +618,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.1" @@ -910,7 +751,7 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys 0.48.0", ] @@ -927,7 +768,7 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "io-lifetimes", "rustix", "windows-sys 0.48.0", @@ -991,28 +832,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" -[[package]] -name = "matchit" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" - [[package]] name = "memchr" version = "2.5.0" @@ -1048,7 +873,7 @@ checksum = "4901771e1d44ddb37964565c654a3223ba41a594d02b8da471cc4464912b5cfa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] @@ -1126,26 +951,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.1", - "libc", -] - [[package]] name = "once_cell" version = "1.17.1" @@ -1181,7 +986,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] @@ -1202,37 +1007,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - [[package]] name = "password-hash" version = "0.4.2" @@ -1268,26 +1042,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" -[[package]] -name = "pin-project" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1313,23 +1067,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" dependencies = [ "proc-macro2", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] @@ -1340,15 +1094,6 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_syscall" version = "0.3.5" @@ -1432,12 +1177,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - [[package]] name = "ryu" version = "1.0.13" @@ -1453,12 +1192,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "security-framework" version = "2.9.0" @@ -1484,45 +1217,21 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" -dependencies = [ - "itoa", - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1568,15 +1277,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - [[package]] name = "shlex" version = "1.1.0" @@ -1592,12 +1292,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - [[package]] name = "socket2" version = "0.4.9" @@ -1630,12 +1324,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.10.0" @@ -1661,21 +1349,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "tempfile" version = "3.5.0" @@ -1684,7 +1366,7 @@ checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", "windows-sys 0.45.0", ] @@ -1698,15 +1380,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thiserror" version = "1.0.40" @@ -1724,17 +1397,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", + "syn 2.0.15", ] [[package]] @@ -1778,7 +1441,6 @@ dependencies = [ "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", @@ -1793,7 +1455,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", ] [[package]] @@ -1820,28 +1482,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -1855,23 +1495,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", - "log", "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - [[package]] name = "tracing-core" version = "0.1.31" @@ -1879,48 +1506,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-oslog" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bc58223383423483e4bc056c7e7b3f77bdee924a9d33834112c69ead06dc847" -dependencies = [ - "bindgen 0.59.2", - "cc", - "cfg-if", - "fnv", - "once_cell", - "parking_lot", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", ] [[package]] @@ -1934,7 +1519,7 @@ name = "tun" version = "0.1.0" dependencies = [ "anyhow", - "bindgen 0.65.1", + "bindgen", "byteorder", "fehler", "futures", @@ -2003,24 +1588,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" @@ -2064,7 +1637,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", "wasm-bindgen-shared", ] @@ -2098,7 +1671,7 @@ checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.15", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/burrow/Cargo.toml b/burrow/Cargo.toml index 5961b83..c9dd71f 100644 --- a/burrow/Cargo.toml +++ b/burrow/Cargo.toml @@ -7,20 +7,14 @@ edition = "2021" crate-type = ["lib", "staticlib"] [dependencies] -tokio = { version = "1.21", features = ["rt", "rt-multi-thread", "macros"] } -tun = { version = "0.1", path = "../tun" , features = ["tokio"]} +tokio = { version = "1.21", features = ["rt", "macros"] } +tun = { version = "0.1", path = "../tun" } clap = { version = "4.3.2", features = ["derive"] } env_logger = "0.10" log = "0.4" -tracing = "0.1" -tracing-subscriber = "0.3" -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.105" -axum = {version = "0.6.20", features = ["json", "macros"]} [target.'cfg(target_os = "linux")'.dependencies] caps = "0.5.5" [target.'cfg(target_vendor = "apple")'.dependencies] nix = { version = "0.26.2" } -tracing-oslog = "0.1" diff --git a/burrow/src/apple/mod.rs b/burrow/src/apple/mod.rs deleted file mode 100644 index 065e817..0000000 --- a/burrow/src/apple/mod.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::net::Ipv4Addr; -use std::io::Error; -use std::os::fd::FromRawFd; -use tracing::field::debug; -use tun::TunInterface; -use tracing_oslog::OsLogger; -use tracing_subscriber::layer::SubscriberExt; -use tracing::debug; - -#[repr(C)] -pub struct NetWorkSettings { - ipv4_addr: i64, - ipv4_netmask: i64, - mtu: i32, -} - -fn encode_ipv4_result(res: Result) -> i64 { - match res { - Ok(addr) => u32::from_be(addr.into()) as i64, - Err(_) => -1, - } -} - -impl From for NetWorkSettings { - fn from(value: TunInterface) -> Self { - debug!("Converting TunInterface {} to NetWorkSettings", value.name().unwrap_or("NONEXISTENT".to_string())); - let ipv4_addr = encode_ipv4_result(value.ipv4_addr()); - let ipv4_netmask = encode_ipv4_result(value.netmask()); - let mtu = value.mtu().unwrap_or(-1); - Self { - ipv4_addr, - ipv4_netmask, - mtu, - } - } -} - -#[no_mangle] -pub extern "C" fn initialize_oslog() { - let collector = tracing_subscriber::registry() - .with(OsLogger::new("com.hackclub.burrow", "default")); - tracing::subscriber::set_global_default(collector).unwrap(); - debug!("Initialized oslog tracing in libburrow rust FFI"); -} - -#[no_mangle] -pub extern "C" fn getNetworkSettings(n: i32) -> NetWorkSettings { - debug!("getNetworkSettings called with fd: {}", n); - let iface = unsafe {TunInterface::from_raw_fd(n)}; - iface.into() -} \ No newline at end of file diff --git a/burrow/src/lib.rs b/burrow/src/lib.rs index 471df26..687d306 100644 --- a/burrow/src/lib.rs +++ b/burrow/src/lib.rs @@ -1,23 +1,13 @@ pub mod ensureroot; -#[cfg(target_vendor = "apple")] -mod apple; -mod server; #[cfg(any(target_os = "linux", target_vendor = "apple"))] use std::{ mem, os::fd::{AsRawFd, FromRawFd}, }; -use std::os::fd::RawFd; -use tracing::debug; use tun::TunInterface; -#[cfg(target_vendor = "apple")] -pub use apple::{NetWorkSettings, getNetworkSettings, initialize_oslog}; - -#[cfg(any(target_os = "linux", target_vendor = "apple"))] -pub use server::spawn_server; // TODO Separate start and retrieve functions #[cfg(any(target_os = "linux", target_vendor = "apple"))] @@ -25,13 +15,9 @@ pub use server::spawn_server; pub extern "C" fn retrieve() -> i32 { let iface2 = (1..100) .filter_map(|i| { - debug!("Getting TunInterface with fd: {:?}", i); let iface = unsafe { TunInterface::from_raw_fd(i) }; match iface.name() { - Ok(name) => { - debug!("Found interface {}", name); - Some(iface) - }, + Ok(_name) => Some(iface), Err(_) => { mem::forget(iface); None @@ -40,32 +26,7 @@ pub extern "C" fn retrieve() -> i32 { }) .next(); match iface2 { - Some(iface) => { - debug!("Found interface {:?}", iface.name()); - iface.as_raw_fd() - }, - None => { - debug!("No interface found"); - -1 - } + Some(iface) => iface.as_raw_fd(), + None => -1, } } - -pub fn get_iface() -> Option { - (1..100) - .filter_map(|i| { - debug!("Getting TunInterface with fd: {:?}", i); - let iface = unsafe { TunInterface::from_raw_fd(i) }; - match iface.name() { - Ok(name) => { - debug!("Found interface {}", name); - Some(iface) - }, - Err(_) => { - mem::forget(iface); - None - } - } - }) - .next() -} diff --git a/burrow/src/server.rs b/burrow/src/server.rs deleted file mode 100644 index 4c7b684..0000000 --- a/burrow/src/server.rs +++ /dev/null @@ -1,89 +0,0 @@ -use axum::{body::Bytes, error_handling::HandleErrorLayer, extract::{DefaultBodyLimit, Path, State}, handler::Handler, http::StatusCode, response::IntoResponse, routing::{delete, get}, Router, Json, debug_handler}; -use std::{ - borrow::Cow, - collections::HashMap, - sync::Arc, - time::Duration, -}; -use tokio::sync::RwLock; -use tokio::runtime::Runtime; -use std::net::{Ipv4Addr, SocketAddr}; -use axum::handler::HandlerWithoutStateExt; -use serde_json::json; -use tun::tokio::TunInterface; // TODO: refactor to tokio TunInterface, which doesn't implement `Send` -use std::thread; -use crate::get_iface; -use tracing::{info, debug, error}; - -type SharedState = Arc>; - -#[no_mangle] -pub extern "C" fn spawn_server(){ - info!("Spawning server"); - let ti = get_iface().unwrap(); - debug!("Got interface"); - let rt = Runtime::new().unwrap(); - let _handle = thread::spawn(move || { - rt.spawn(async { - service(ti).await; - }); - }); - debug!("Spawned thread: finish spawn server"); -} - -async fn service(ti: crate::TunInterface){ - info!("Spawning service"); - let shared_state = Arc::new(RwLock::new(TunInterface::new(ti).unwrap())); - info!("Created shared state"); - let state_cl= shared_state.clone(); - let lp = tokio::spawn( - async move { - burrow_loop(state_cl).await; - } - ); - let srv = tokio::spawn( - async move { - serve(shared_state).await; - } - ); - info!("Created threads"); - tokio::join!(lp, srv); -} - -async fn burrow_loop(state: SharedState){ - debug!("loop called"); - let mut buf = [0u8; 1504]; - loop { - let n = state.write().await.read(&mut buf[..]).await.unwrap(); - // do something with the data - info!("read {} bytes", n); - } -} - -async fn serve(state: SharedState){ - debug!("serve called"); - let app_router = Router::new() - .route("/info", get(network_settings)) - .with_state(state); - let port = std::env::var("BURROW_PORT").unwrap_or("3000".to_string()); - let sock_addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port.parse().unwrap()); - info!("Listening on {}...", sock_addr); - axum::Server::bind(&sock_addr) - .serve(app_router.into_make_service()) - .await - .unwrap(); -} - -#[debug_handler] -async fn network_settings(State(state): State) -> impl IntoResponse { - let st = state.read().await; - let name = st.name().await.unwrap(); - let mtu = st.mtu().await.unwrap(); - let netmask = st.netmask().await.unwrap(); - let res = Json(json!({ - "name": name, - "mtu": mtu, - "netmask": netmask, - })); - res -} \ No newline at end of file diff --git a/tun/src/tokio/mod.rs b/tun/src/tokio/mod.rs index 35f6dfa..ae99b73 100644 --- a/tun/src/tokio/mod.rs +++ b/tun/src/tokio/mod.rs @@ -31,74 +31,4 @@ impl TunInterface { } } } - - pub async fn mtu(&self) -> io::Result { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().mtu()) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn set_mtu(&self, mtu: i32) -> io::Result<()> { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().set_mtu(mtu)) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn name(&self) -> io::Result { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().name()) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn netmask(&self) -> io::Result { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().netmask()) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn set_netmask(&self, netmask: std::net::Ipv4Addr) -> io::Result<()> { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().set_netmask(netmask)) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn ipv4_addr(&self) -> io::Result { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().ipv4_addr()) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } - - pub async fn set_ipv4_addr(&self, addr: std::net::Ipv4Addr) -> io::Result<()> { - loop { - let mut guard = self.inner.readable().await?; - match guard.try_io(|inner| inner.get_ref().set_ipv4_addr(addr)) { - Ok(result) => return result, - Err(_would_block) => continue, - } - } - } }