use crate::server::udp::MockUdpAssociator;
use crate::server::*;
use rama_core::ServiceInput;
use rama_net::address::HostWithPort;
use rama_net::user::credentials::basic;
use rama_utils::str::non_empty_str;
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_udp_associate_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(b"\x05\x07\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default());
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_auth_flow_declined_udp_associate_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x02\x00\x02")
.write(b"\x05\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(b"\x05\x07\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default());
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_auth_flow_used_udp_associate_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x02\x00\x02")
.write(b"\x05\x02")
.read(b"\x01\x04john\x06secret")
.write(b"\x01\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(b"\x05\x07\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_authorizer(basic!("john", "secret").into_authorizer());
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_auth_flow_username_only_udp_associate_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x02\x00\x02")
.write(b"\x05\x02")
.read(b"\x01\x04john\x00")
.write(b"\x01\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(b"\x05\x07\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_authorizer(user::Basic::new_insecure(non_empty_str!("john")).into_authorizer());
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_udp_associate_mock_failure() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(b"\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_udp_associator(MockUdpAssociator::new_err(ReplyKind::ConnectionRefused));
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_udp_associate_mock_success_no_data() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 42])
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_udp_associator(MockUdpAssociator::new(HostWithPort::local_ipv4(42)));
let result = server.accept(stream).await;
result.unwrap();
}