server.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. use crate::protocol::parser::MUMBLE_PROTOCOL_VERSION;
  2. use crate::server::client::{Client, Config as ClientConfig};
  3. use crate::server::connection_worker::ConnectionWorker;
  4. use crate::server::session_pool::SessionPool;
  5. use crate::server::tcp_control_channel::TcpControlChannel;
  6. use crate::server::udp_audio_channel::{ServerInfo, UdpAudioChannel, UdpWorker};
  7. use crate::storage::Storage;
  8. use dashmap::DashMap;
  9. use log::{error, info};
  10. use rand::prelude::StdRng;
  11. use rand::{Rng, SeedableRng};
  12. use std::net::{IpAddr, SocketAddr};
  13. use std::num::NonZeroU32;
  14. use std::sync::Arc;
  15. use tokio::net::{TcpListener, UdpSocket};
  16. use tokio_rustls::rustls::{Certificate, NoClientAuth, PrivateKey, ServerConfig};
  17. use tokio_rustls::TlsAcceptor;
  18. pub struct Config {
  19. pub ip_address: IpAddr,
  20. pub port: u16,
  21. pub certificate: Certificate,
  22. pub private_key: PrivateKey,
  23. pub path_to_db_file: String,
  24. }
  25. pub struct Server {
  26. config: Config,
  27. rng: StdRng,
  28. storage: Arc<Storage>,
  29. clients: Arc<DashMap<SessionId, Client<TcpControlChannel, UdpAudioChannel>>>,
  30. session_pool: Arc<SessionPool>,
  31. }
  32. type SessionId = u32;
  33. impl Server {
  34. pub fn new(config: Config) -> Self {
  35. let storage = Storage::open(&config.path_to_db_file);
  36. Server {
  37. config,
  38. rng: StdRng::from_entropy(),
  39. storage: Arc::new(storage),
  40. clients: Default::default(),
  41. session_pool: Arc::new(SessionPool::new()),
  42. }
  43. }
  44. pub async fn run(mut self) {
  45. let mut tls_config = ServerConfig::new(NoClientAuth::new());
  46. let result = tls_config.set_single_cert(
  47. vec![self.config.certificate.clone()],
  48. self.config.private_key.clone(),
  49. );
  50. if let Err(err) = result {
  51. error!("{}", err);
  52. panic!();
  53. }
  54. let socket_address = SocketAddr::new(self.config.ip_address, self.config.port);
  55. let tls_acceptor = TlsAcceptor::from(Arc::new(tls_config));
  56. let tcp_listener = match TcpListener::bind(socket_address).await {
  57. Ok(listener) => listener,
  58. Err(_) => {
  59. error!("Couldn't bind tcp socket to {}", socket_address);
  60. panic!();
  61. }
  62. };
  63. let udp_socket = match UdpSocket::bind(socket_address).await {
  64. Ok(socket) => socket,
  65. Err(_) => {
  66. error!("Couldn't bind udp socket to {}", socket_address);
  67. panic!();
  68. }
  69. };
  70. let server_info = ServerInfo {
  71. version: MUMBLE_PROTOCOL_VERSION.into(),
  72. connected_users: self.storage.watch_connected_count(),
  73. max_users: 10,
  74. max_bandwidth: 128000,
  75. };
  76. let udp_worker = Arc::new(UdpWorker::start(udp_socket, server_info).await);
  77. info!("Server listening on {}", socket_address);
  78. loop {
  79. let (tcp_stream, _) = match tcp_listener.accept().await {
  80. Ok(stream) => stream,
  81. Err(err) => {
  82. info!("Tcp error: {}", err);
  83. continue;
  84. }
  85. };
  86. let tls_stream = match tls_acceptor.accept(tcp_stream).await {
  87. Ok(stream) => stream,
  88. Err(err) => {
  89. info!("Tls error: {}", err);
  90. continue;
  91. }
  92. };
  93. let worker = ConnectionWorker::new(
  94. Arc::clone(&self.session_pool),
  95. Arc::clone(&self.storage),
  96. Arc::clone(&self.clients),
  97. );
  98. worker
  99. .start(
  100. tls_stream,
  101. self.create_client_config(),
  102. Arc::clone(&udp_worker),
  103. )
  104. .await;
  105. }
  106. }
  107. fn create_client_config(&mut self) -> ClientConfig {
  108. let crypto_key = self.generate_key();
  109. let server_nonce = self.generate_key();
  110. let client_nonce = self.generate_key();
  111. ClientConfig {
  112. crypto_key,
  113. server_nonce,
  114. client_nonce,
  115. alpha_codec_version: -2147483637,
  116. beta_codec_version: -2147483632,
  117. prefer_alpha: true,
  118. opus_support: true,
  119. welcome_text: "Welcome".to_string(),
  120. max_bandwidth: 128000,
  121. max_users: 10,
  122. allow_html: true,
  123. max_message_length: 512,
  124. max_image_message_length: 100000,
  125. max_username_length: 64,
  126. min_compatible_version: 0x10200,
  127. server_password: None,
  128. pbkdf2_iterations: NonZeroU32::new(100_000).unwrap(),
  129. }
  130. }
  131. fn generate_key(&mut self) -> [u8; 16] {
  132. let mut buffer = [0; 16];
  133. self.rng.fill(&mut buffer);
  134. buffer
  135. }
  136. }