use alloc::vec;
use alloc::vec::Vec;
use std::net::SocketAddr;
use std::string::{String, ToString};
use crate::jls::JlsUser;
use crate::log::trace;
#[derive(Clone, Debug, Default)]
pub struct JlsServerConfig {
pub enable: bool,
pub users: Vec<JlsUser>,
pub upstream_addr: Option<String>,
pub upstream_sni: Option<String>,
pub rate_limit: u64,
}
impl JlsServerConfig {
pub fn new(
pwd: String,
iv: String,
upstream_addr: Option<String>,
mut upstream_sni: Option<String>,
) -> Self {
match upstream_addr.clone() {
Some(addr) => {
if let Err(_) = addr.parse::<SocketAddr>() {
if upstream_sni.is_none() {
upstream_sni = addr
.split(":")
.next()
.map(|s| s.to_string());
}
}
}
None => {
upstream_sni = None;
}
}
JlsServerConfig {
enable: true,
users: vec![JlsUser::new(&pwd, &iv)],
upstream_addr: upstream_addr,
upstream_sni: upstream_sni,
rate_limit: u64::MAX,
}
}
pub(crate) fn check_server_name(&self, server_name: Option<&str>) -> bool {
if let Some(upstream) = &self.upstream_sni {
let ret = server_name == Some(upstream);
trace!("[jls] server name mateches:{}", ret);
return ret;
} else {
trace!("[jls] upstream sni not found");
return true;
}
}
pub fn add_user(mut self, pwd: String, iv: String) -> Self {
self.users.push(JlsUser::new(&pwd, &iv));
self
}
pub fn with_upstream_addr(mut self, addr: String) -> Self {
self.upstream_addr = Some(addr.clone());
if addr.parse::<SocketAddr>().is_err() && self.upstream_sni.is_none() {
self.upstream_sni = addr
.split(":")
.next()
.map(|s| s.to_string());
}
self
}
pub fn with_server_name(mut self, server_name: String) -> Self {
self.upstream_sni = Some(server_name);
self
}
pub fn with_rate_limit(mut self, rate_limit: u64) -> Self {
self.rate_limit = rate_limit;
self
}
pub fn enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}