these changes don't work correctly
This commit is contained in:
Generated
+399
-3
@@ -96,6 +96,30 @@ version = "1.0.101"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
|
checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-channel"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
|
||||||
|
dependencies = [
|
||||||
|
"concurrent-queue",
|
||||||
|
"event-listener-strategy",
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-task"
|
||||||
|
version = "4.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atomic-waker"
|
||||||
|
version = "1.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
@@ -117,6 +141,19 @@ dependencies = [
|
|||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "blocking"
|
||||||
|
version = "1.6.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
|
||||||
|
dependencies = [
|
||||||
|
"async-channel",
|
||||||
|
"async-task",
|
||||||
|
"futures-io",
|
||||||
|
"futures-lite",
|
||||||
|
"piper",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
@@ -129,6 +166,26 @@ version = "1.11.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "c2rust-bitfields"
|
||||||
|
version = "0.21.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dcee50917f9de1a018e3f4f9a8f2ff3d030a288cffa4b18d9b391e97c12e4cfb"
|
||||||
|
dependencies = [
|
||||||
|
"c2rust-bitfields-derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "c2rust-bitfields-derive"
|
||||||
|
version = "0.21.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b457277798202ccd365b9c112ebee08ddd57f1033916c8b8ea52f222e5b715d"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cesu8"
|
name = "cesu8"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@@ -141,6 +198,12 @@ version = "1.0.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg_aliases"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chacha20"
|
name = "chacha20"
|
||||||
version = "0.9.1"
|
version = "0.9.1"
|
||||||
@@ -243,6 +306,15 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "concurrent-queue"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
@@ -261,6 +333,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-utils"
|
||||||
|
version = "0.8.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crypto-common"
|
name = "crypto-common"
|
||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
@@ -335,6 +413,33 @@ dependencies = [
|
|||||||
"windows-sys 0.61.2",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "event-listener"
|
||||||
|
version = "5.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
|
||||||
|
dependencies = [
|
||||||
|
"concurrent-queue",
|
||||||
|
"parking",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "event-listener-strategy"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
|
||||||
|
dependencies = [
|
||||||
|
"event-listener",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fastrand"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fiat-crypto"
|
name = "fiat-crypto"
|
||||||
version = "0.2.9"
|
version = "0.2.9"
|
||||||
@@ -347,6 +452,104 @@ version = "0.1.5"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
|
||||||
|
dependencies = [
|
||||||
|
"futures-channel",
|
||||||
|
"futures-core",
|
||||||
|
"futures-executor",
|
||||||
|
"futures-io",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-task",
|
||||||
|
"futures-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-channel"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-sink",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-core"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-executor"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-task",
|
||||||
|
"futures-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-io"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-lite"
|
||||||
|
version = "2.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-macro"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-sink"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-task"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-util"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
||||||
|
dependencies = [
|
||||||
|
"futures-channel",
|
||||||
|
"futures-core",
|
||||||
|
"futures-io",
|
||||||
|
"futures-macro",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-task",
|
||||||
|
"memchr",
|
||||||
|
"pin-project-lite",
|
||||||
|
"slab",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
@@ -473,6 +676,12 @@ dependencies = [
|
|||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ipnet"
|
||||||
|
version = "2.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "is_terminal_polyfill"
|
name = "is_terminal_polyfill"
|
||||||
version = "1.70.2"
|
version = "1.70.2"
|
||||||
@@ -496,7 +705,7 @@ dependencies = [
|
|||||||
"combine",
|
"combine",
|
||||||
"jni-sys",
|
"jni-sys",
|
||||||
"log",
|
"log",
|
||||||
"thiserror",
|
"thiserror 1.0.69",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
"windows-sys 0.45.0",
|
"windows-sys 0.45.0",
|
||||||
]
|
]
|
||||||
@@ -525,6 +734,16 @@ version = "0.2.182"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
|
checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libloading"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lock_api"
|
name = "lock_api"
|
||||||
version = "0.4.14"
|
version = "0.4.14"
|
||||||
@@ -577,11 +796,17 @@ name = "netrunner-client"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android_logger",
|
"android_logger",
|
||||||
|
"bytes",
|
||||||
"jni",
|
"jni",
|
||||||
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"netrunner-common",
|
"netrunner-common",
|
||||||
"smoltcp",
|
"smoltcp",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
|
"tun",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -611,6 +836,18 @@ dependencies = [
|
|||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.30.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.11.0",
|
||||||
|
"cfg-if",
|
||||||
|
"cfg_aliases",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nu-ansi-term"
|
name = "nu-ansi-term"
|
||||||
version = "0.50.3"
|
version = "0.50.3"
|
||||||
@@ -638,6 +875,12 @@ version = "0.3.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
|
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking"
|
||||||
|
version = "2.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking_lot"
|
name = "parking_lot"
|
||||||
version = "0.12.5"
|
version = "0.12.5"
|
||||||
@@ -667,6 +910,17 @@ version = "0.2.16"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "piper"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1"
|
||||||
|
dependencies = [
|
||||||
|
"atomic-waker",
|
||||||
|
"fastrand",
|
||||||
|
"futures-io",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "poly1305"
|
name = "poly1305"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
@@ -879,6 +1133,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slab"
|
||||||
|
version = "0.4.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.15.1"
|
version = "1.15.1"
|
||||||
@@ -943,7 +1203,16 @@ version = "1.0.69"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl 1.0.69",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "2.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl 2.0.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -957,6 +1226,17 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "2.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "thread_local"
|
||||||
version = "1.1.9"
|
version = "1.1.9"
|
||||||
@@ -1055,6 +1335,23 @@ dependencies = [
|
|||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tun"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b35f176015650e3bd849e85808d809e5b54da2ba7df983c5c3b601a2a8f1095e"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"cfg-if",
|
||||||
|
"ipnet",
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"nix",
|
||||||
|
"thiserror 2.0.18",
|
||||||
|
"windows-sys 0.61.2",
|
||||||
|
"wintun-bindings",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typenum"
|
name = "typenum"
|
||||||
version = "1.19.0"
|
version = "1.19.0"
|
||||||
@@ -1193,6 +1490,15 @@ dependencies = [
|
|||||||
"windows-targets 0.42.2",
|
"windows-targets 0.42.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.59.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.60.2"
|
version = "0.60.2"
|
||||||
@@ -1226,6 +1532,22 @@ dependencies = [
|
|||||||
"windows_x86_64_msvc 0.42.2",
|
"windows_x86_64_msvc 0.42.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm 0.52.6",
|
||||||
|
"windows_aarch64_msvc 0.52.6",
|
||||||
|
"windows_i686_gnu 0.52.6",
|
||||||
|
"windows_i686_gnullvm 0.52.6",
|
||||||
|
"windows_i686_msvc 0.52.6",
|
||||||
|
"windows_x86_64_gnu 0.52.6",
|
||||||
|
"windows_x86_64_gnullvm 0.52.6",
|
||||||
|
"windows_x86_64_msvc 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-targets"
|
name = "windows-targets"
|
||||||
version = "0.53.5"
|
version = "0.53.5"
|
||||||
@@ -1236,7 +1558,7 @@ dependencies = [
|
|||||||
"windows_aarch64_gnullvm 0.53.1",
|
"windows_aarch64_gnullvm 0.53.1",
|
||||||
"windows_aarch64_msvc 0.53.1",
|
"windows_aarch64_msvc 0.53.1",
|
||||||
"windows_i686_gnu 0.53.1",
|
"windows_i686_gnu 0.53.1",
|
||||||
"windows_i686_gnullvm",
|
"windows_i686_gnullvm 0.53.1",
|
||||||
"windows_i686_msvc 0.53.1",
|
"windows_i686_msvc 0.53.1",
|
||||||
"windows_x86_64_gnu 0.53.1",
|
"windows_x86_64_gnu 0.53.1",
|
||||||
"windows_x86_64_gnullvm 0.53.1",
|
"windows_x86_64_gnullvm 0.53.1",
|
||||||
@@ -1249,6 +1571,12 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
|
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_gnullvm"
|
name = "windows_aarch64_gnullvm"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1261,6 +1589,12 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
|
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_msvc"
|
name = "windows_aarch64_msvc"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1273,12 +1607,24 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
|
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnu"
|
name = "windows_i686_gnu"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
|
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnullvm"
|
name = "windows_i686_gnullvm"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1291,6 +1637,12 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
|
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_msvc"
|
name = "windows_i686_msvc"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1303,6 +1655,12 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
|
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnu"
|
name = "windows_x86_64_gnu"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1315,6 +1673,12 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
|
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnullvm"
|
name = "windows_x86_64_gnullvm"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
@@ -1327,12 +1691,44 @@ version = "0.42.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
|
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_msvc"
|
name = "windows_x86_64_msvc"
|
||||||
version = "0.53.1"
|
version = "0.53.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winreg"
|
||||||
|
version = "0.55.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wintun-bindings"
|
||||||
|
version = "0.7.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "27ae04d34b8569174e849128d2e36538329a27daa79c06ed0375f2c5d6704461"
|
||||||
|
dependencies = [
|
||||||
|
"blocking",
|
||||||
|
"c2rust-bitfields",
|
||||||
|
"futures",
|
||||||
|
"libloading",
|
||||||
|
"log",
|
||||||
|
"thiserror 2.0.18",
|
||||||
|
"windows-sys 0.61.2",
|
||||||
|
"winreg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.51.0"
|
version = "0.51.0"
|
||||||
|
|||||||
@@ -15,5 +15,11 @@ netrunner-common = { path = "../common" } # Наша общая либа
|
|||||||
smoltcp = { version = "0.12.0", default-features = false, features = ["medium-ip", "proto-ipv4", "socket-tcp"] }
|
smoltcp = { version = "0.12.0", default-features = false, features = ["medium-ip", "proto-ipv4", "socket-tcp"] }
|
||||||
tokio = { version = "1.36", features = ["full"] }
|
tokio = { version = "1.36", features = ["full"] }
|
||||||
jni = "0.21"
|
jni = "0.21"
|
||||||
|
bytes = "1.5"
|
||||||
android_logger = "0.13"
|
android_logger = "0.13"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
tun = "0.8.5"
|
||||||
|
lazy_static = "1.4.0"
|
||||||
|
libc = "0.2.182"
|
||||||
|
tracing = "0.1"
|
||||||
|
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
pub mod stack;
|
||||||
|
pub mod tun;
|
||||||
|
|||||||
+67
-1
@@ -1 +1,67 @@
|
|||||||
fn main() {}
|
mod stack;
|
||||||
|
mod tun;
|
||||||
|
|
||||||
|
use netrunner_common::{
|
||||||
|
logger_init, proxy::connection::connection::ConnectionRole, proxy::network::Network,
|
||||||
|
};
|
||||||
|
use stack::interface::NetStack;
|
||||||
|
use tracing::{error, info};
|
||||||
|
use tun::{desktop::create_linux_tun, device::TunDevice};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
// 1. Инициализация логов
|
||||||
|
logger_init();
|
||||||
|
info!("Starting NetRunner VPN Bridge...");
|
||||||
|
|
||||||
|
// 2. Настройка физического уровня (TUN)
|
||||||
|
let tun_dev = create_linux_tun();
|
||||||
|
let my_phy = TunDevice::new(tun_dev, 1500);
|
||||||
|
|
||||||
|
// 3. Создаем объект Network
|
||||||
|
let net = Network::new(8080, ConnectionRole::Client, Some("0.0.0.0:4443".into()));
|
||||||
|
|
||||||
|
// 4. Инициализируем ЕДИНЫЙ туннель для всего приложения.
|
||||||
|
// Этот метод внутри создает TLS-подключение, Muxer и запускает TunnelEngine.
|
||||||
|
info!("Initializing global TLS tunnel to proxy...");
|
||||||
|
let muxer = match net.initialize_client_tunnel().await {
|
||||||
|
Ok(m) => m,
|
||||||
|
Err(e) => {
|
||||||
|
error!("Failed to initialize global tunnel: {}", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 5. Создаем стек, передавая ему РАБОЧИЙ муксер.
|
||||||
|
// Теперь данные из TUN будут уходить в реальный TLS-туннель.
|
||||||
|
let mut stack = NetStack::new(my_phy, muxer.clone());
|
||||||
|
|
||||||
|
// 6. Запускаем SOCKS-сервер (Network), чтобы он слушал порт 8080
|
||||||
|
// и использовал тот же самый муксер для обычных прокси-запросов.
|
||||||
|
let net_handle = {
|
||||||
|
let muxer_for_net = muxer.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
info!("SOCKS5 server starting on 127.0.0.1:8080");
|
||||||
|
net.run_with_muxer(muxer_for_net).await;
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("VPN BRIDGE IS RUNNING");
|
||||||
|
|
||||||
|
// 7. Запускаем цикл обработки стека (блокирующий поток)
|
||||||
|
let stack_loop = tokio::task::spawn_blocking(move || loop {
|
||||||
|
stack.poll();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Ждем завершения (по сути бесконечно)
|
||||||
|
tokio::select! {
|
||||||
|
res = stack_loop => {
|
||||||
|
if let Err(e) = res {
|
||||||
|
error!("Stack loop panicked: {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ = net_handle => {
|
||||||
|
error!("Network server stopped unexpectedly");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,353 @@
|
|||||||
|
use bytes::{Bytes, BytesMut};
|
||||||
|
use netrunner_common::protocol::codec::frame::FrameType;
|
||||||
|
use netrunner_common::protocol::codec::socks::{SocksReply, SocksRequest};
|
||||||
|
use netrunner_common::protocol::parser::parser::Parser;
|
||||||
|
use netrunner_common::proxy::connection::muxer::{MuxMessage, Muxer};
|
||||||
|
use smoltcp::iface::{Config, Interface, SocketHandle, SocketSet, SocketStorage};
|
||||||
|
use smoltcp::socket::tcp::{Socket as SmolTcpSocket, SocketBuffer};
|
||||||
|
use smoltcp::socket::AnySocket;
|
||||||
|
use smoltcp::time::Instant;
|
||||||
|
use smoltcp::wire::IpListenEndpoint;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::os::unix::io::AsRawFd;
|
||||||
|
use tracing::{debug, info, trace};
|
||||||
|
|
||||||
|
pub enum BridgeState {
|
||||||
|
WaitingHandshake,
|
||||||
|
WaitingConnect,
|
||||||
|
DataTransferring {
|
||||||
|
tx_to_muxer: tokio::sync::mpsc::Sender<MuxMessage>,
|
||||||
|
stream_id: u32,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct NetStack<D: smoltcp::phy::Device + AsRawFd + 'static> {
|
||||||
|
interface: Interface,
|
||||||
|
device: &'static mut D,
|
||||||
|
sockets: SocketSet<'static>,
|
||||||
|
socket_buffers: HashMap<SocketHandle, BytesMut>,
|
||||||
|
bridges: HashMap<SocketHandle, BridgeState>,
|
||||||
|
muxer: Muxer,
|
||||||
|
outbound_rx: tokio::sync::mpsc::UnboundedReceiver<(SocketHandle, Bytes)>,
|
||||||
|
outbound_tx: tokio::sync::mpsc::UnboundedSender<(SocketHandle, Bytes)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
static ref START_TIME: std::time::Instant = std::time::Instant::now();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _current_smoltcp_time() -> Instant {
|
||||||
|
let nanos = START_TIME.elapsed().as_micros() as i64;
|
||||||
|
smoltcp::time::Instant::from_micros(nanos)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D: smoltcp::phy::Device + AsRawFd> NetStack<D> {
|
||||||
|
pub fn new(device_obj: D, muxer: Muxer) -> Self {
|
||||||
|
let now = _current_smoltcp_time();
|
||||||
|
let device: &'static mut D = Box::leak(Box::new(device_obj));
|
||||||
|
|
||||||
|
let config = Config::new(smoltcp::wire::HardwareAddress::Ip);
|
||||||
|
let mut interface = Interface::new(config, device, now);
|
||||||
|
interface.set_any_ip(true);
|
||||||
|
|
||||||
|
interface.update_ip_addrs(|addrs| {
|
||||||
|
addrs
|
||||||
|
.push(smoltcp::wire::IpCidr::new(
|
||||||
|
smoltcp::wire::IpAddress::v4(10, 0, 0, 2),
|
||||||
|
24,
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
});
|
||||||
|
|
||||||
|
interface
|
||||||
|
.routes_mut()
|
||||||
|
.add_default_ipv4_route(smoltcp::wire::Ipv4Address::new(10, 0, 0, 1))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let rx_data = Box::leak(vec![0u8; 4096].into_boxed_slice());
|
||||||
|
let tx_data = Box::leak(vec![0u8; 4096].into_boxed_slice());
|
||||||
|
|
||||||
|
let mut socket = SmolTcpSocket::new(SocketBuffer::new(rx_data), SocketBuffer::new(tx_data));
|
||||||
|
|
||||||
|
// 4. Теперь listen() сработает, так как у интерфейса есть адрес!
|
||||||
|
let endpoint = IpListenEndpoint {
|
||||||
|
addr: None, // ВАЖНО: Принимаем пакеты для ЛЮБОГО IP назначения
|
||||||
|
port: 443, // Для HTTPS
|
||||||
|
};
|
||||||
|
socket.listen(endpoint).unwrap();
|
||||||
|
|
||||||
|
let storage: Vec<SocketStorage> = (0..16).map(|_| SocketStorage::EMPTY).collect();
|
||||||
|
let mut sockets = SocketSet::new(Box::leak(storage.into_boxed_slice()));
|
||||||
|
sockets.add(socket);
|
||||||
|
|
||||||
|
let (outbound_tx, outbound_rx) = tokio::sync::mpsc::unbounded_channel();
|
||||||
|
|
||||||
|
Self {
|
||||||
|
interface,
|
||||||
|
device,
|
||||||
|
sockets,
|
||||||
|
socket_buffers: HashMap::new(),
|
||||||
|
bridges: HashMap::new(),
|
||||||
|
muxer,
|
||||||
|
outbound_rx,
|
||||||
|
outbound_tx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn drive_interface(&mut self, timestamp: Instant) {
|
||||||
|
match self
|
||||||
|
.interface
|
||||||
|
.poll(timestamp, self.device, &mut self.sockets)
|
||||||
|
{
|
||||||
|
smoltcp::iface::PollResult::None => {}
|
||||||
|
res => debug!("Interface activity: {:?}", res),
|
||||||
|
}
|
||||||
|
let delay = self
|
||||||
|
.interface
|
||||||
|
.poll_delay(timestamp, &self.sockets)
|
||||||
|
.map(|d| d.total_millis() as i32)
|
||||||
|
.unwrap_or(10);
|
||||||
|
let raw_fd = self.device.as_raw_fd();
|
||||||
|
let mut fds = [libc::pollfd {
|
||||||
|
fd: raw_fd,
|
||||||
|
events: libc::POLLIN, // Ждем данные на вход
|
||||||
|
revents: 0,
|
||||||
|
}];
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
libc::poll(fds.as_mut_ptr(), 1, delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn manage_socket_lifecycle(&mut self) {
|
||||||
|
for (_, any_socket) in self.sockets.iter_mut() {
|
||||||
|
let socket = SmolTcpSocket::downcast_mut(any_socket).unwrap();
|
||||||
|
|
||||||
|
// Если сокет закрылся или "отвисел" в TimeWait, возвращаем его в Listen
|
||||||
|
if !socket.is_active() && !socket.is_listening() {
|
||||||
|
let endpoint = IpListenEndpoint {
|
||||||
|
addr: None,
|
||||||
|
port: 443,
|
||||||
|
};
|
||||||
|
socket.listen(endpoint).unwrap();
|
||||||
|
println!("DEBUG: Сокет готов к новому соединению");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_socks_logic(&mut self, handle: SocketHandle) {
|
||||||
|
let buf = self.socket_buffers.get_mut(&handle).unwrap();
|
||||||
|
let state = self
|
||||||
|
.bridges
|
||||||
|
.entry(handle)
|
||||||
|
.or_insert(BridgeState::WaitingHandshake);
|
||||||
|
|
||||||
|
trace!(handle = ?handle, buf_len = buf.len(), "Processing SOCKS logic");
|
||||||
|
match state {
|
||||||
|
BridgeState::WaitingHandshake => {
|
||||||
|
if let Ok(Some(SocksRequest::Handshake { .. })) = SocksRequest::parse(buf) {
|
||||||
|
let mut reply = BytesMut::with_capacity(2);
|
||||||
|
SocksReply::HandshakeSelect { method: 0x00 }.write_to(&mut reply);
|
||||||
|
|
||||||
|
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
|
||||||
|
socket.send_slice(&reply).unwrap();
|
||||||
|
|
||||||
|
*state = BridgeState::WaitingConnect;
|
||||||
|
return; // <--- ВАЖНО: Выходим, чтобы smoltcp отправил этот пакет отдельно
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BridgeState::WaitingConnect => {
|
||||||
|
// 1. Парсим запрос (парсер должен сам отрезать байты через advance/split_to)
|
||||||
|
if let Ok(Some(SocksRequest::Connect { target, .. })) = SocksRequest::parse(buf) {
|
||||||
|
let stream_id = self.muxer.next_id();
|
||||||
|
let target_str = target.to_string();
|
||||||
|
info!(handle = ?handle, target = %target_str, stream_id, "SOCKS5 Connect request");
|
||||||
|
|
||||||
|
let (v_tx, mut v_rx) = tokio::sync::mpsc::channel::<Bytes>(1024);
|
||||||
|
|
||||||
|
// 2. Пытаемся зарегистрировать стрим СИНХРОННО
|
||||||
|
// Это гарантирует, что Muxer узнает об ID до того, как придет ответ из сети
|
||||||
|
if self.muxer.try_register_stream(stream_id, v_tx.clone()) {
|
||||||
|
debug!(stream_id, "Stream registered synchronously via try_write");
|
||||||
|
|
||||||
|
// Сразу шлем Connect в сеть
|
||||||
|
let _ = self.muxer.to_network.try_send(MuxMessage {
|
||||||
|
stream_id,
|
||||||
|
frame_type: FrameType::Connect,
|
||||||
|
data: Bytes::from(target_str),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// ПЛАН Б: Если лок занят, спавним асинхронную задачу.
|
||||||
|
// ВАЖНО: Мы НЕ шлем Connect здесь, его пришлет сама задача ПОСЛЕ регистрации.
|
||||||
|
let muxer_clone = self.muxer.clone();
|
||||||
|
let target_bytes = Bytes::from(target_str);
|
||||||
|
let v_tx_clone = v_tx.clone();
|
||||||
|
|
||||||
|
tokio::spawn(async move {
|
||||||
|
muxer_clone.register_stream(stream_id, v_tx_clone).await;
|
||||||
|
let _ = muxer_clone
|
||||||
|
.to_network
|
||||||
|
.send(MuxMessage {
|
||||||
|
stream_id,
|
||||||
|
frame_type: FrameType::Connect,
|
||||||
|
data: target_bytes,
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
debug!(
|
||||||
|
stream_id,
|
||||||
|
"Stream registered asynchronously (lock was busy)"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Запускаем задачу проброса данных из сети в smoltcp
|
||||||
|
let outbound_tx = self.outbound_tx.clone();
|
||||||
|
let handle_clone = handle;
|
||||||
|
tokio::spawn(async move {
|
||||||
|
while let Some(data) = v_rx.recv().await {
|
||||||
|
if outbound_tx.send((handle_clone, data)).is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
buf.clear();
|
||||||
|
// 4. Отвечаем клиенту (curl)
|
||||||
|
let mut reply = BytesMut::new();
|
||||||
|
SocksReply::ConnectResult {
|
||||||
|
reply_code: 0x00,
|
||||||
|
atyp: 0x01,
|
||||||
|
addr: [0, 0, 0, 0],
|
||||||
|
port: 0,
|
||||||
|
}
|
||||||
|
.write_to(&mut reply);
|
||||||
|
|
||||||
|
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
|
||||||
|
socket
|
||||||
|
.send_slice(&reply)
|
||||||
|
.expect("Failed to send SOCKS reply");
|
||||||
|
|
||||||
|
// ПЕРЕХОД
|
||||||
|
*state = BridgeState::DataTransferring {
|
||||||
|
tx_to_muxer: self.muxer.to_network.clone(),
|
||||||
|
stream_id,
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BridgeState::DataTransferring {
|
||||||
|
tx_to_muxer,
|
||||||
|
stream_id,
|
||||||
|
} => {
|
||||||
|
if !buf.is_empty() {
|
||||||
|
// Забираем все накопленные данные из буфера
|
||||||
|
let data = buf.split().freeze();
|
||||||
|
trace!(handle = ?handle, stream_id = *stream_id, bytes = data.len(), "Forwarding data smoltcp -> muxer");
|
||||||
|
// Отправляем в Muxer
|
||||||
|
let _ = tx_to_muxer.try_send(MuxMessage {
|
||||||
|
stream_id: *stream_id,
|
||||||
|
frame_type: FrameType::Data,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_payloads(&mut self) {
|
||||||
|
let handles: Vec<_> = self.sockets.iter().map(|(h, _)| h).collect();
|
||||||
|
|
||||||
|
for handle in handles {
|
||||||
|
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
|
||||||
|
|
||||||
|
// 1. СОСТОЯНИЕ: Соединение только что установилось
|
||||||
|
if socket.is_active() && !self.bridges.contains_key(&handle) {
|
||||||
|
if let Some(target) = socket.local_endpoint() {
|
||||||
|
let stream_id = self.muxer.next_id();
|
||||||
|
info!("TUN Intercept: Auto-initiating SOCKS for target {}", target);
|
||||||
|
|
||||||
|
// ВАЖНО: Мы САМИ инициируем процесс для локального прокси
|
||||||
|
// Регистрируем стрим в муксере
|
||||||
|
let (v_tx, mut v_rx) = tokio::sync::mpsc::channel::<Bytes>(1024);
|
||||||
|
self.muxer.try_register_stream(stream_id, v_tx);
|
||||||
|
|
||||||
|
// Шлем CONNECT (твой муксер/прокси поймет это как SOCKS-запрос)
|
||||||
|
let _ = self.muxer.to_network.try_send(MuxMessage {
|
||||||
|
stream_id,
|
||||||
|
frame_type: FrameType::Connect,
|
||||||
|
data: Bytes::from(target.to_string()),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Запускаем стандартную задачу проброса данных ИЗ сети в smoltcp
|
||||||
|
let outbound_tx = self.outbound_tx.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
while let Some(data) = v_rx.recv().await {
|
||||||
|
let _ = outbound_tx.send((handle, data));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Переходим сразу в режим передачи данных
|
||||||
|
// Теперь всё, что пришлет Firefox, мы будем просто гнать в Muxer как FrameType::Data
|
||||||
|
self.bridges.insert(
|
||||||
|
handle,
|
||||||
|
BridgeState::DataTransferring {
|
||||||
|
stream_id,
|
||||||
|
tx_to_muxer: self.muxer.to_network.clone(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. СОСТОЯНИЕ: Передача данных (DataTransferring)
|
||||||
|
if let Some(BridgeState::DataTransferring {
|
||||||
|
stream_id,
|
||||||
|
tx_to_muxer,
|
||||||
|
}) = self.bridges.get(&handle)
|
||||||
|
{
|
||||||
|
if socket.can_recv() {
|
||||||
|
let mut temp_buf = vec![0u8; 2048];
|
||||||
|
if let Ok(size) = socket.recv_slice(&mut temp_buf) {
|
||||||
|
// Это РЕАЛЬНЫЕ данные от Firefox (например, TLS Client Hello)
|
||||||
|
// Мы их просто оборачиваем в твой протокол и шлем в муксер
|
||||||
|
let _ = tx_to_muxer.try_send(MuxMessage {
|
||||||
|
stream_id: *stream_id,
|
||||||
|
frame_type: FrameType::Data,
|
||||||
|
data: Bytes::copy_from_slice(&temp_buf[..size]),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn poll(&mut self) {
|
||||||
|
let timestamp = _current_smoltcp_time();
|
||||||
|
|
||||||
|
self.drive_interface(timestamp);
|
||||||
|
|
||||||
|
self.process_payloads();
|
||||||
|
|
||||||
|
while let Ok((handle, data)) = self.outbound_rx.try_recv() {
|
||||||
|
if let Some(socket_state) = self.bridges.get(&handle) {
|
||||||
|
// ПИШЕМ ТОЛЬКО ЕСЛИ МЫ УЖЕ В DATA TRANSFER
|
||||||
|
if let BridgeState::DataTransferring { .. } = socket_state {
|
||||||
|
if self.sockets.iter().any(|(h, _)| h == handle) {
|
||||||
|
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
|
||||||
|
if socket.can_send() {
|
||||||
|
debug!(handle = ?handle, len = data.len(), head = ?&data[..std::cmp::min(data.len(), 10)], "Writing to curl");
|
||||||
|
let _ = socket.send_slice(&data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Если мы еще в WaitingConnect, возвращаем данные в очередь
|
||||||
|
// или просто игнорируем (они придут следующим тиком)
|
||||||
|
debug!(handle = ?handle, "Data arrived before SOCKS handshake finished, delaying...");
|
||||||
|
// Можно использовать self.outbound_tx.send(...) чтобы вернуть в хвост
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.manage_socket_lifecycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pub mod interface;
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
use tun::Device;
|
||||||
|
|
||||||
|
pub fn create_linux_tun() -> Device {
|
||||||
|
let mut config = tun::Configuration::default();
|
||||||
|
config
|
||||||
|
.tun_name("netr0")
|
||||||
|
.address((10, 0, 0, 1)) // IP нашего "моста"
|
||||||
|
.netmask((255, 255, 255, 0)) // Маска подсети
|
||||||
|
.up(); // Сразу включаем интерфейс
|
||||||
|
|
||||||
|
// Это создаст в системе интерфейс tun0
|
||||||
|
let dev = tun::create(&config).expect("Нужны права root или CAP_NET_ADMIN!");
|
||||||
|
dev
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
use bytes::{Bytes, BytesMut};
|
||||||
|
use smoltcp::phy::{ChecksumCapabilities, Device, DeviceCapabilities, Medium, RxToken, TxToken};
|
||||||
|
use std::io::{Read, Write};
|
||||||
|
use std::os::fd::RawFd;
|
||||||
|
use std::os::unix::io::AsRawFd;
|
||||||
|
|
||||||
|
pub struct TunDevice<T: Read + Write + AsRawFd> {
|
||||||
|
pub io: T, // Сюда мы запихнем или File (Android) или Tun-либу
|
||||||
|
mtu: usize,
|
||||||
|
read_buffer: BytesMut,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Read + Write + AsRawFd> TunDevice<T> {
|
||||||
|
pub fn new(io: T, mtu: usize) -> Self {
|
||||||
|
let fd = io.as_raw_fd();
|
||||||
|
unsafe {
|
||||||
|
let flags = libc::fcntl(fd, libc::F_GETFL);
|
||||||
|
if flags == -1 {
|
||||||
|
panic!("Не удалось получить флаги файла");
|
||||||
|
}
|
||||||
|
libc::fcntl(fd, libc::F_SETFL, flags | libc::O_NONBLOCK);
|
||||||
|
}
|
||||||
|
Self {
|
||||||
|
io,
|
||||||
|
mtu,
|
||||||
|
read_buffer: BytesMut::with_capacity(mtu),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Read + Write + AsRawFd> Device for TunDevice<T> {
|
||||||
|
type RxToken<'a>
|
||||||
|
= TunRxToken
|
||||||
|
where
|
||||||
|
Self: 'a;
|
||||||
|
type TxToken<'a>
|
||||||
|
= TunTxToken<'a, T>
|
||||||
|
where
|
||||||
|
Self: 'a;
|
||||||
|
|
||||||
|
fn capabilities(&self) -> DeviceCapabilities {
|
||||||
|
let mut caps = DeviceCapabilities::default();
|
||||||
|
caps.medium = Medium::Ip;
|
||||||
|
caps.max_transmission_unit = self.mtu;
|
||||||
|
caps.checksum = ChecksumCapabilities::ignored();
|
||||||
|
caps
|
||||||
|
}
|
||||||
|
|
||||||
|
fn receive(
|
||||||
|
&mut self,
|
||||||
|
_timestamp: smoltcp::time::Instant,
|
||||||
|
) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
|
||||||
|
let mut tmp_buf = [0u8; 2048];
|
||||||
|
match self.io.read(&mut tmp_buf) {
|
||||||
|
Ok(n) if n > 0 => {
|
||||||
|
let rx_data = Bytes::copy_from_slice(&tmp_buf[..n]);
|
||||||
|
|
||||||
|
let rx = TunRxToken { buffer: rx_data };
|
||||||
|
let tx = TunTxToken { io: &mut self.io };
|
||||||
|
Some((rx, tx))
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
|
||||||
|
Some(TunTxToken { io: &mut self.io })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct TunRxToken {
|
||||||
|
buffer: Bytes,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RxToken for TunRxToken {
|
||||||
|
fn consume<R, F>(mut self, f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnOnce(&[u8]) -> R,
|
||||||
|
{
|
||||||
|
f(&mut self.buffer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct TunTxToken<'a, T: Write> {
|
||||||
|
io: &'a mut T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, T: Write> TxToken for TunTxToken<'a, T> {
|
||||||
|
fn consume<R, F>(self, len: usize, f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnOnce(&mut [u8]) -> R,
|
||||||
|
{
|
||||||
|
// ПРЯМАЯ ЗАПИСЬ БЕЗ ДОБАВЛЕНИЯ PI-ЗАГОЛОВКА
|
||||||
|
let mut buffer = vec![0u8; len];
|
||||||
|
let result = f(&mut buffer);
|
||||||
|
let _ = self.io.write_all(&buffer);
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Read + Write + AsRawFd> AsRawFd for TunDevice<T> {
|
||||||
|
fn as_raw_fd(&self) -> RawFd {
|
||||||
|
self.io.as_raw_fd()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
pub mod desktop;
|
||||||
|
pub mod device;
|
||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
pub mod crypto;
|
mod crypto;
|
||||||
mod logger;
|
mod logger;
|
||||||
pub mod protocol;
|
pub mod protocol;
|
||||||
pub mod proxy;
|
pub mod proxy;
|
||||||
pub mod tlseng;
|
mod tlseng;
|
||||||
pub mod utils;
|
mod utils;
|
||||||
|
|
||||||
pub use logger::logger_init;
|
pub use logger::logger_init;
|
||||||
|
|||||||
@@ -106,7 +106,18 @@ impl SocksReply {
|
|||||||
|
|
||||||
impl SocksTarget {
|
impl SocksTarget {
|
||||||
pub fn to_string(&self) -> String {
|
pub fn to_string(&self) -> String {
|
||||||
|
if self.host.len() == 4 {
|
||||||
|
// Похоже на IPv4
|
||||||
|
let ip =
|
||||||
|
std::net::Ipv4Addr::new(self.host[0], self.host[1], self.host[2], self.host[3]);
|
||||||
|
format!("{}:{}", ip, self.port)
|
||||||
|
} else if self.host.len() == 16 {
|
||||||
|
// Похоже на IPv6
|
||||||
|
format!("[...]:{}", self.port)
|
||||||
|
} else {
|
||||||
|
// Считаем, что это домен (текст)
|
||||||
let host_str = String::from_utf8_lossy(&self.host);
|
let host_str = String::from_utf8_lossy(&self.host);
|
||||||
format!("{}:{}", host_str, self.port)
|
format!("{}:{}", host_str, self.port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -50,6 +50,17 @@ impl Muxer {
|
|||||||
self.id_gen.next()
|
self.id_gen.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn try_register_stream(&self, id: u32, tx: tokio::sync::mpsc::Sender<Bytes>) -> bool {
|
||||||
|
// 1. Исправлено имя поля: streams вместо active_streams
|
||||||
|
// 2. Добавлена аннотация типа для guard, чтобы Rust понимал, что внутри HashMap
|
||||||
|
if let Ok(mut guard) = self.streams.try_write() {
|
||||||
|
let guard: &mut HashMap<u32, Sender<Bytes>> = &mut *guard;
|
||||||
|
guard.insert(id, tx);
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
pub async fn register_stream(&self, stream_id: u32, tx: Sender<Bytes>) {
|
pub async fn register_stream(&self, stream_id: u32, tx: Sender<Bytes>) {
|
||||||
let mut lock = self.streams.write().await;
|
let mut lock = self.streams.write().await;
|
||||||
lock.insert(stream_id, tx);
|
lock.insert(stream_id, tx);
|
||||||
|
|||||||
@@ -29,6 +29,22 @@ impl Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn run_with_muxer(&self, muxer: Muxer) {
|
||||||
|
let addr = format!("127.0.0.1:{}", self.port);
|
||||||
|
let listener = TcpListener::bind(&addr).await.expect("SOCKS bind failed");
|
||||||
|
info!(socks_addr = %addr, "SOCKS5 server listener started");
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if let Ok((stream, client_addr)) = listener.accept().await {
|
||||||
|
let current_muxer = muxer.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let connection = Connection::new(stream, client_addr, false);
|
||||||
|
let _ = connection.handle_socks_client(current_muxer).await;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Добавляем инструмент, чтобы видеть параметры запуска сети в логах
|
// Добавляем инструмент, чтобы видеть параметры запуска сети в логах
|
||||||
#[instrument(skip(self), fields(role = ?self.role, port = self.port))]
|
#[instrument(skip(self), fields(role = ?self.role, port = self.port))]
|
||||||
pub async fn run(&self) {
|
pub async fn run(&self) {
|
||||||
@@ -84,7 +100,7 @@ impl Network {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Вспомогательный метод для Клиента: создает TLS туннель и запускает TunnelEngine
|
/// Вспомогательный метод для Клиента: создает TLS туннель и запускает TunnelEngine
|
||||||
async fn initialize_client_tunnel(&self) -> Result<Muxer, String> {
|
pub async fn initialize_client_tunnel(&self) -> Result<Muxer, String> {
|
||||||
let server_addr = self.remote_proxy_addr.as_ref().ok_or("No proxy addr")?;
|
let server_addr = self.remote_proxy_addr.as_ref().ok_or("No proxy addr")?;
|
||||||
|
|
||||||
// Вместо создания Connection (который нужен для обработки клиентов),
|
// Вместо создания Connection (который нужен для обработки клиентов),
|
||||||
|
|||||||
Reference in New Issue
Block a user