Browse Source

socks5 respones

pull/48/head
ssrlive 3 years ago
committed by B. Blechschmidt
parent
commit
6e81e78dfb
  1. 45
      src/socks.rs

45
src/socks.rs

@ -6,8 +6,8 @@ use crate::{
}, },
}; };
use smoltcp::wire::IpProtocol; use smoltcp::wire::IpProtocol;
use socks5_impl::protocol::{self, Address, AddressType, UserKey}; use socks5_impl::protocol::{self, Address, UserKey};
use std::{collections::VecDeque, convert::TryFrom, net::SocketAddr, rc::Rc}; use std::{collections::VecDeque, net::SocketAddr, rc::Rc};
#[derive(Eq, PartialEq, Debug)] #[derive(Eq, PartialEq, Debug)]
#[allow(dead_code)] #[allow(dead_code)]
@ -231,37 +231,20 @@ impl SocksConnection {
} }
fn receive_connection_status(&mut self) -> Result<(), Error> { fn receive_connection_status(&mut self) -> Result<(), Error> {
if self.server_inbuf.len() < 4 { let response = protocol::Response::rebuild_from_stream(&mut self.server_inbuf);
return Ok(()); if let Err(e) = &response {
} if e.kind() == std::io::ErrorKind::UnexpectedEof {
let ver = self.server_inbuf[0]; log::trace!("Waiting for more data \"{}\"...", e);
let rep = self.server_inbuf[1]; return Ok(());
let _rsv = self.server_inbuf[2]; } else {
let atyp = self.server_inbuf[3]; return Err(e.to_string().into());
}
if ver != 5 {
return Err("SOCKS5 server replied with an unexpected version.".into());
} }
let response = response?;
if rep != 0 { if response.reply != protocol::Reply::Succeeded {
return Err("SOCKS5 connection unsuccessful.".into()); return Err(format!("SOCKS connection failed: {}", response.reply).into());
} }
assert!(self.server_inbuf.is_empty());
let message_length = match AddressType::try_from(atyp)? {
AddressType::Domain => {
if self.server_inbuf.len() < 5 {
return Ok(());
}
if self.server_inbuf.len() < 7 + (self.server_inbuf[4] as usize) {
return Ok(());
}
7 + (self.server_inbuf[4] as usize)
}
AddressType::IPv4 => 10,
AddressType::IPv6 => 22,
};
self.server_inbuf.drain(0..message_length);
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…
Cancel
Save