Files
async-socks5/src/lib.rs

131 lines
4.8 KiB
Rust

pub mod client;
pub mod errors;
pub mod messages;
pub mod network;
mod serialize;
pub mod server;
#[cfg(test)]
mod test {
use crate::client::{LoginInfo, SOCKSv5Client, UsernamePassword};
use crate::network::generic::Networklike;
use crate::network::testing::TestingStack;
use crate::server::{SOCKSv5Server, SecurityParameters};
use async_std::task;
#[test]
fn unrestricted_login() {
task::block_on(async {
let mut network_stack = TestingStack::default();
// generate the server
let security_parameters = SecurityParameters::unrestricted();
let default_port = network_stack.listen("localhost", 9999).await.unwrap();
let server =
SOCKSv5Server::new(network_stack.clone(), security_parameters, default_port);
let _server_task = task::spawn(async move { server.run().await });
let stream = network_stack.connect("localhost", 9999).await.unwrap();
let login_info = LoginInfo {
username_password: None,
};
let client = SOCKSv5Client::new(network_stack, stream, &login_info).await;
assert!(client.is_ok());
})
}
#[test]
fn disallow_unrestricted() {
task::block_on(async {
let mut network_stack = TestingStack::default();
// generate the server
let mut security_parameters = SecurityParameters::unrestricted();
security_parameters.allow_unauthenticated = false;
let default_port = network_stack.listen("localhost", 9999).await.unwrap();
let server =
SOCKSv5Server::new(network_stack.clone(), security_parameters, default_port);
let _server_task = task::spawn(async move { server.run().await });
let stream = network_stack.connect("localhost", 9999).await.unwrap();
let login_info = LoginInfo {
username_password: None,
};
let client = SOCKSv5Client::new(network_stack, stream, &login_info).await;
assert!(client.is_err());
})
}
#[test]
fn password_checks() {
task::block_on(async {
let mut network_stack = TestingStack::default();
// generate the server
let security_parameters = SecurityParameters {
allow_unauthenticated: false,
allow_connection: None,
connect_tls: None,
check_password: Some(|username, password| {
username == "awick" && password == "password"
}),
};
let default_port = network_stack.listen("localhost", 9999).await.unwrap();
let server =
SOCKSv5Server::new(network_stack.clone(), security_parameters, default_port);
let _server_task = task::spawn(async move { server.run().await });
// try the positive side
let stream = network_stack.connect("localhost", 9999).await.unwrap();
let login_info = LoginInfo {
username_password: Some(UsernamePassword {
username: "awick".to_string(),
password: "password".to_string(),
}),
};
let client = SOCKSv5Client::new(network_stack.clone(), stream, &login_info).await;
assert!(client.is_ok());
// try the negative side
let stream = network_stack.connect("localhost", 9999).await.unwrap();
let login_info = LoginInfo {
username_password: Some(UsernamePassword {
username: "adamw".to_string(),
password: "password".to_string(),
}),
};
let client = SOCKSv5Client::new(network_stack, stream, &login_info).await;
assert!(client.is_err());
})
}
#[test]
fn firewall_blocks() {
task::block_on(async {
let mut network_stack = TestingStack::default();
// generate the server
let mut security_parameters = SecurityParameters::unrestricted();
security_parameters.allow_connection = Some(|_, _| false);
let default_port = network_stack.listen("localhost", 9999).await.unwrap();
let server =
SOCKSv5Server::new(network_stack.clone(), security_parameters, default_port);
let _server_task = task::spawn(async move { server.run().await });
let stream = network_stack.connect("localhost", 9999).await.unwrap();
let login_info = LoginInfo {
username_password: None,
};
let client = SOCKSv5Client::new(network_stack, stream, &login_info).await;
assert!(client.is_err());
})
}
}