use rama_core::ServiceInput;
use rama_net::address::HostWithPort;
use rama_net::user::credentials::basic;
use rama_utils::str::non_empty_str;
use crate::server::bind::MockBinder;
use crate::server::*;
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_bind_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x02\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_bind_failure_method_not_supported() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x02\x00\x02")
.write(b"\x05\x00")
.read(b"\x05\x02\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_bind_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\x02\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_bind_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\x02\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_bind_mock_failure() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x02\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_binder(MockBinder::new_err(ReplyKind::ConnectionRefused));
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_bind_mock_failure_on_second_reply() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x02\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 3])
.write(b"\x05\x06\x00\x01\x00\x00\x00\x00\x00\x00")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default()).with_binder(MockBinder::new_bind_err(
HostWithPort::local_ipv4(3),
ReplyKind::TtlExpired,
));
let result = server.accept(stream).await;
result.unwrap_err();
}
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_bind_mock_success_no_data() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x02\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 5])
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 0, 0, 0, 0, 0, 0])
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default()).with_binder(MockBinder::new(
HostWithPort::local_ipv4(5),
HostWithPort::default_ipv4(0),
));
let result = server.accept(stream).await;
result.unwrap();
}
#[tokio::test]
async fn test_socks5_acceptor_no_auth_client_default_bind_mock_success_with_data() {
let stream = tokio_test::io::Builder::new()
.read(b"\x05\x01\x00")
.write(b"\x05\x00")
.read(b"\x05\x02\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 42])
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 43])
.read(b"ping")
.write(b"pong")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default()).with_binder(
MockBinder::new(HostWithPort::local_ipv4(42), HostWithPort::local_ipv4(43))
.with_proxy_data(
tokio_test::io::Builder::new()
.write(b"ping")
.read(b"pong")
.build(),
),
);
let result = server.accept(stream).await;
result.unwrap();
}
#[tokio::test]
async fn test_socks5_acceptor_with_auth_flow_client_bind_mock_success_with_data() {
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\x02\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 42])
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 43])
.read(b"ping")
.write(b"pong")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_authorizer(basic!("john", "secret").into_authorizer())
.with_binder(
MockBinder::new(HostWithPort::local_ipv4(42), HostWithPort::local_ipv4(43))
.with_proxy_data(
tokio_test::io::Builder::new()
.write(b"ping")
.read(b"pong")
.build(),
),
);
let result = server.accept(stream).await;
result.unwrap();
}
#[tokio::test]
async fn test_socks5_acceptor_with_auth_flow_username_only_client_bind_mock_success_with_data() {
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\x02\x00\x01\x00\x00\x00\x00\x00\x00")
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 42])
.write(&[b'\x05', b'\x00', b'\x00', b'\x01', 127, 0, 0, 1, 0, 43])
.read(b"ping")
.write(b"pong")
.build();
let stream = ServiceInput::new(stream);
let server = Socks5Acceptor::new(Executor::default())
.with_authorizer(user::Basic::new_insecure(non_empty_str!("john")).into_authorizer())
.with_binder(
MockBinder::new(HostWithPort::local_ipv4(42), HostWithPort::local_ipv4(43))
.with_proxy_data(
tokio_test::io::Builder::new()
.write(b"ping")
.read(b"pong")
.build(),
),
);
let result = server.accept(stream).await;
result.unwrap();
}