diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-10-10 17:18:31 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-10-10 17:18:31 +0200 |
| commit | e88e8df4d464e7c937e64ea68701a7c155bd3f1d (patch) | |
| tree | 428952fc5fb884106f82bca29735734fce270f5a | |
| parent | f1338cb1e2c830f1049a99b4a7b1eab3adc7087f (diff) | |
| download | mum-e88e8df4d464e7c937e64ea68701a7c155bd3f1d.tar.gz | |
create network.rs and move code
Co-authored-by: Eskil Queseth <eskilq@kth.se>
| -rw-r--r-- | mumd/Cargo.toml | 1 | ||||
| -rw-r--r-- | mumd/src/main.rs | 25 | ||||
| -rw-r--r-- | mumd/src/network.rs | 40 |
3 files changed, 43 insertions, 23 deletions
diff --git a/mumd/Cargo.toml b/mumd/Cargo.toml index bb68525..5573453 100644 --- a/mumd/Cargo.toml +++ b/mumd/Cargo.toml @@ -14,6 +14,7 @@ clap = "2.33" mumble-protocol = "0.3" cpal = { git = "https://github.com/RustAudio/cpal" } opus = "0.2" +futures-util = "0.3" bytes = "0.5" byteorder = "1" 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() +} |
