diff options
Diffstat (limited to 'mumd/src')
| -rw-r--r-- | mumd/src/main.rs | 25 | ||||
| -rw-r--r-- | mumd/src/network.rs | 40 |
2 files changed, 42 insertions, 23 deletions
diff --git a/mumd/src/main.rs b/mumd/src/main.rs index 12e467d..c8cf68b 100644 --- a/mumd/src/main.rs +++ b/mumd/src/main.rs @@ -1,4 +1,5 @@ mod audio; +mod network; use crate::audio::Audio; use argparse::ArgumentParser; @@ -12,7 +13,6 @@ use futures::StreamExt; use futures::SinkExt; use mumble_protocol::control::msgs; -use mumble_protocol::control::ClientControlCodec; use mumble_protocol::control::ControlPacket; use mumble_protocol::crypt::ClientCryptState; use mumble_protocol::voice::VoicePacket; @@ -25,10 +25,7 @@ use std::net::Ipv6Addr; use std::net::SocketAddr; use std::net::ToSocketAddrs; -use tokio::net::TcpStream; use tokio::net::UdpSocket; -use tokio_tls::TlsConnector; -use tokio_util::codec::Decoder; use tokio_util::udp::UdpFramed; use tokio::time::{self, Duration}; @@ -50,25 +47,7 @@ async fn connect( // Wrap crypt_state_sender in Option, so we can call it only once let mut crypt_state_sender = Some(crypt_state_sender); - // Connect to server via TCP - let stream = TcpStream::connect(&server_addr).await.expect("Failed to connect to server:"); - println!("TCP connected.."); - - // Wrap the connection in TLS - let mut builder = native_tls::TlsConnector::builder(); - builder.danger_accept_invalid_certs(accept_invalid_cert); - let connector: TlsConnector = builder - .build() - .expect("Failed to create TLS connector") - .into(); - let tls_stream = connector - .connect(&server_host, stream) - .await - .expect("Failed to connect TLS: {}"); - println!("TLS connected.."); - - // Wrap the TLS stream with Mumble's client-side control-channel codec - let (sink, mut stream) = ClientControlCodec::new().framed(tls_stream).split(); + let (sink, mut stream) = network::connect_tcp(server_addr, server_host, accept_invalid_cert).await; let sink = Arc::new(Mutex::new(sink)); // Handshake (omitting `Version` message for brevity) diff --git a/mumd/src/network.rs b/mumd/src/network.rs new file mode 100644 index 0000000..6aec343 --- /dev/null +++ b/mumd/src/network.rs @@ -0,0 +1,40 @@ +use futures::StreamExt; +use futures_util::stream::{SplitSink, SplitStream}; +use mumble_protocol::{Serverbound, Clientbound}; +use mumble_protocol::control::ClientControlCodec; +use mumble_protocol::control::ControlCodec; +use mumble_protocol::control::ControlPacket; +use std::net::SocketAddr; +use tokio::net::TcpStream; +use tokio_tls::TlsConnector; +use tokio_tls::TlsStream; +use tokio_util::codec::Decoder; +use tokio_util::codec::Framed; + +pub async fn connect_tcp( + server_addr: SocketAddr, + server_host: String, + accept_invalid_cert: bool, +) -> ( + SplitSink<Framed<TlsStream<TcpStream>, ControlCodec<Serverbound, Clientbound>>, ControlPacket<Serverbound>>, + SplitStream<Framed<TlsStream<TcpStream>, ControlCodec<Serverbound, Clientbound>>> +) { + + let stream = TcpStream::connect(&server_addr).await.expect("failed to connect to server:"); + println!("TCP connected"); + + let mut builder = native_tls::TlsConnector::builder(); + builder.danger_accept_invalid_certs(accept_invalid_cert); + let connector: TlsConnector = builder + .build() + .expect("failed to create TLS connector") + .into(); + let tls_stream = connector + .connect(&server_host, stream) + .await + .expect("failed to connect TLS: {}"); + println!("TLS connected"); + + // Wrap the TLS stream with Mumble's client-side control-channel codec + ClientControlCodec::new().framed(tls_stream).split() +} |
