use std::time::Duration;
use crate::configuration::Proxy;
+use crate::middleware::get as get_middleware;
/// A proxy server that listens for plaintext connections and forwards them
/// via TLS.
while running.load(Ordering::SeqCst) {
match listener.accept() {
- Ok((stream, addr)) => {
- info!("New {} connection from {}", configuration.protocol, addr);
+ Ok((stream, address)) => {
+ info!("New {} connection from {}", configuration.protocol, address);
- let configuration_clone = Arc::clone(&configuration);
+ let configuration_clone = Arc::clone(configuration);
let handle = spawn(move || {
handle_client(stream, &configuration_clone);
});
return;
}
+ let available_middleware = get_middleware();
+ let available_middleware_clone = Arc::clone(&available_middleware);
+
let connector = match TlsConnector::new() {
Ok(c) => c,
Err(e) => {
}
};
- let remote_addr = format!(
+ let remote_address = format!(
"{}:{}",
configuration.remote_host, configuration.remote_port
);
- let tcp_stream = match TcpStream::connect(&remote_addr) {
+ let tcp_stream = match TcpStream::connect(&remote_address) {
Ok(stream) => stream,
Err(e) => {
- error!("Failed to connect to {}: {}", remote_addr, e);
+ error!("Failed to connect to {}: {}", remote_address, e);
return;
}
};
let mut buffer = [0u8; 8192];
let mut client_reader = client_stream;
loop {
- debug!(">");
let bytes_read = match client_reader.read(&mut buffer) {
Ok(0) => break,
Ok(n) => n,
}
};
- let debug_str = String::from_utf8_lossy(&buffer[..bytes_read])
+ let mut command = buffer[..bytes_read].to_vec();
+
+ if let Ok(mut guard) = available_middleware.lock() {
+ for middleware in guard.iter_mut() {
+ command = middleware.client_message(&command);
+ }
+ }
+
+ let debug_original = String::from_utf8_lossy(&buffer[..bytes_read])
.replace('\n', "\\n")
.replace('\r', "\\r")
.replace('\t', "\\t");
- debug!(">>> {}", debug_str);
+
+ let debug_final = String::from_utf8_lossy(&command)
+ .replace('\n', "\\n")
+ .replace('\r', "\\r")
+ .replace('\t', "\\t");
+
+ debug!(">>> {debug_original}");
+ if debug_original != debug_final {
+ debug!("### {debug_final}");
+ }
// Lock the TLS stream and write the data to server
match tls_stream_clone.lock() {
Ok(mut tls_guard) => {
- if let Err(error) = tls_guard.write_all(&buffer[..bytes_read]) {
+ if let Err(error) = tls_guard.write_all(&command) {
debug!(">>> Error writing to server: {error}");
break;
}
let mut buffer = [0u8; 8192];
let mut client_writer = client_stream_clone;
loop {
- debug!("<");
// Lock the TLS stream and read from the server
let bytes_read = match tls_stream_clone.lock() {
Ok(mut tls_guard) => match tls_guard.read(&mut buffer) {
}
};
- let debug_str = String::from_utf8_lossy(&buffer[..bytes_read])
+ let mut command = buffer[..bytes_read].to_vec();
+
+ if let Ok(mut guard) = available_middleware_clone.lock() {
+ for middleware in guard.iter_mut() {
+ command = middleware.server_message(&command);
+ }
+ }
+
+ let debug_original = String::from_utf8_lossy(&buffer[..bytes_read])
.replace('\n', "\\n")
.replace('\r', "\\r")
.replace('\t', "\\t");
- debug!("<<< {}", debug_str);
+
+ let debug_final = String::from_utf8_lossy(&command)
+ .replace('\n', "\\n")
+ .replace('\r', "\\r")
+ .replace('\t', "\\t");
+ debug!("<<< {debug_original}");
+ if debug_original != debug_final {
+ debug!("### {debug_final}");
+ }
// Write decrypted data to client
- if client_writer.write_all(&buffer[..bytes_read]).is_err() {
+ if client_writer.write_all(&command).is_err() {
debug!("<<< ERR");
break;
}