mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-06-10 00:27:46 +00:00
Unexpected comsuming (#48)
This commit is contained in:
parent
a00f4b1a8b
commit
8d835dc96d
2 changed files with 19 additions and 11 deletions
|
@ -23,7 +23,7 @@ mio = { version = "0.8", features = ["os-poll", "net", "os-ext"] }
|
||||||
nix = { version = "0.26", features = ["process", "signal"] }
|
nix = { version = "0.26", features = ["process", "signal"] }
|
||||||
prctl = "1.0"
|
prctl = "1.0"
|
||||||
smoltcp = { version = "0.10.0", features = ["std", "phy-tuntap_interface"] }
|
smoltcp = { version = "0.10.0", features = ["std", "phy-tuntap_interface"] }
|
||||||
socks5-impl = { version = "0.4", default-features = false }
|
socks5-impl = { version = "0.5", default-features = false }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
unicase = "2.6.0"
|
unicase = "2.6.0"
|
||||||
url = "2.4"
|
url = "2.4"
|
||||||
|
@ -34,6 +34,10 @@ jni = { version = "0.21", default-features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
ctor = "0.2"
|
ctor = "0.2"
|
||||||
reqwest = { version = "0.11", default-features = false, features = ["blocking", "json", "rustls-tls"] }
|
reqwest = { version = "0.11", default-features = false, features = [
|
||||||
|
"blocking",
|
||||||
|
"json",
|
||||||
|
"rustls-tls",
|
||||||
|
] }
|
||||||
serial_test = "2.0"
|
serial_test = "2.0"
|
||||||
test-log = "0.2"
|
test-log = "0.2"
|
||||||
|
|
22
src/socks.rs
22
src/socks.rs
|
@ -6,7 +6,9 @@ use crate::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use smoltcp::wire::IpProtocol;
|
use smoltcp::wire::IpProtocol;
|
||||||
use socks5_impl::protocol::{self, handshake, password_method, Address, AuthMethod, UserKey};
|
use socks5_impl::protocol::{
|
||||||
|
self, handshake, password_method, Address, AuthMethod, StreamOperation, UserKey,
|
||||||
|
};
|
||||||
use std::{collections::VecDeque, net::SocketAddr, rc::Rc};
|
use std::{collections::VecDeque, net::SocketAddr, rc::Rc};
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Debug)]
|
#[derive(Eq, PartialEq, Debug)]
|
||||||
|
@ -132,16 +134,17 @@ impl SocksConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receive_server_hello_socks5(&mut self) -> Result<(), Error> {
|
fn receive_server_hello_socks5(&mut self) -> Result<(), Error> {
|
||||||
let response = handshake::Response::rebuild_from_stream(&mut self.server_inbuf);
|
let response = handshake::Response::retrieve_from_stream(&mut self.server_inbuf.clone());
|
||||||
if let Err(e) = &response {
|
if let Err(e) = &response {
|
||||||
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
||||||
log::trace!("receive_server_hello_socks5 need more data \"{}\"...", e);
|
log::trace!("receive_server_hello_socks5 needs more data \"{}\"...", e);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
return Err(e.to_string().into());
|
return Err(e.to_string().into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let respones = response?;
|
let respones = response?;
|
||||||
|
self.server_inbuf.drain(0..respones.len());
|
||||||
let auth_method = respones.method;
|
let auth_method = respones.method;
|
||||||
|
|
||||||
if auth_method != AuthMethod::NoAuth && self.credentials.is_none()
|
if auth_method != AuthMethod::NoAuth && self.credentials.is_none()
|
||||||
|
@ -176,17 +179,18 @@ impl SocksConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receive_auth_data(&mut self) -> Result<(), Error> {
|
fn receive_auth_data(&mut self) -> Result<(), Error> {
|
||||||
let response = password_method::Response::rebuild_from_stream(&mut self.server_inbuf);
|
use password_method::Response;
|
||||||
|
let response = Response::retrieve_from_stream(&mut self.server_inbuf.clone());
|
||||||
if let Err(e) = &response {
|
if let Err(e) = &response {
|
||||||
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
||||||
log::trace!("receive_auth_data need more data \"{}\"...", e);
|
log::trace!("receive_auth_data needs more data \"{}\"...", e);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
return Err(e.to_string().into());
|
return Err(e.to_string().into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert!(self.server_inbuf.is_empty());
|
|
||||||
let response = response?;
|
let response = response?;
|
||||||
|
self.server_inbuf.drain(0..response.len());
|
||||||
if response.status != password_method::Status::Succeeded {
|
if response.status != password_method::Status::Succeeded {
|
||||||
return Err(format!("SOCKS authentication failed: {:?}", response.status).into());
|
return Err(format!("SOCKS authentication failed: {:?}", response.status).into());
|
||||||
}
|
}
|
||||||
|
@ -195,20 +199,20 @@ impl SocksConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receive_connection_status(&mut self) -> Result<(), Error> {
|
fn receive_connection_status(&mut self) -> Result<(), Error> {
|
||||||
let response = protocol::Response::rebuild_from_stream(&mut self.server_inbuf);
|
let response = protocol::Response::retrieve_from_stream(&mut self.server_inbuf.clone());
|
||||||
if let Err(e) = &response {
|
if let Err(e) = &response {
|
||||||
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
||||||
log::trace!("receive_connection_status need more data \"{}\"...", e);
|
log::trace!("receive_connection_status needs more data \"{}\"...", e);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
return Err(e.to_string().into());
|
return Err(e.to_string().into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let response = response?;
|
let response = response?;
|
||||||
|
self.server_inbuf.drain(0..response.len());
|
||||||
if response.reply != protocol::Reply::Succeeded {
|
if response.reply != protocol::Reply::Succeeded {
|
||||||
return Err(format!("SOCKS connection failed: {}", response.reply).into());
|
return Err(format!("SOCKS connection failed: {}", response.reply).into());
|
||||||
}
|
}
|
||||||
assert!(self.server_inbuf.is_empty());
|
|
||||||
self.server_outbuf.append(&mut self.data_buf);
|
self.server_outbuf.append(&mut self.data_buf);
|
||||||
self.data_buf.clear();
|
self.data_buf.clear();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue