Add unencrypted TCP handling.

This commit is contained in:
yukirij 2024-08-18 15:59:51 -07:00
parent 2dacd18f72
commit b119775293
2 changed files with 56 additions and 22 deletions

View File

@ -36,6 +36,7 @@ impl App {
if let Ok(mut filesystem) = FileSystem::init() { if let Ok(mut filesystem) = FileSystem::init() {
// Load salts // Load salts
println!("Loading salts..");
let mut salts = Sparse::new(); let mut salts = Sparse::new();
let salt_count = filesystem.salt_count()?; let salt_count = filesystem.salt_count()?;
for id in 0..salt_count { for id in 0..salt_count {
@ -44,6 +45,7 @@ impl App {
} }
// Load handles // Load handles
println!("Loading handles..");
let mut user_handle = Trie::new(); let mut user_handle = Trie::new();
let handle_count = filesystem.handle_count()?; let handle_count = filesystem.handle_count()?;
for id in 0..handle_count { for id in 0..handle_count {
@ -52,7 +54,7 @@ impl App {
} }
// Load users // Load users
println!("Load users.."); println!("Loading users..");
let mut users = Pool::new(); let mut users = Pool::new();
let mut user_id = Sparse::new(); let mut user_id = Sparse::new();
let user_count = filesystem.user_count()?; let user_count = filesystem.user_count()?;
@ -63,7 +65,7 @@ impl App {
} }
// Load sessions // Load sessions
println!("Load sessions.."); println!("Loading sessions..");
let mut sessions = Trie::new(); let mut sessions = Trie::new();
let mut times = Vec::<(u64, SessionToken)>::new(); let mut times = Vec::<(u64, SessionToken)>::new();
let session_count = filesystem.session_count()?; let session_count = filesystem.session_count()?;
@ -83,14 +85,14 @@ impl App {
// Organize sessions by most recent // Organize sessions by most recent
let mut session_time = Chain::new(); let mut session_time = Chain::new();
times.sort_by(|(a, _), (b, _)| { times.sort_by(|(a, _), (b, _)| {
if a < b { std::cmp::Ordering::Greater } else { std::cmp::Ordering::Less } if a > b { std::cmp::Ordering::Greater } else { std::cmp::Ordering::Less }
}); });
for (_, token) in times { for (_, token) in times {
let id = session_time.add(token); let id = session_time.add(token);
sessions.get_mut(&token).unwrap().chain_id = id; sessions.get_mut(&token).unwrap().chain_id = id;
} }
println!("Done."); println!("App data ready.");
Ok(Self { Ok(Self {
filesystem:filesystem, filesystem:filesystem,

View File

@ -12,7 +12,14 @@ mod manager;
use app::App; use app::App;
use hyper::body::Bytes; use hyper::body::Bytes;
use hyper_util::rt::TokioIo; use hyper_util::rt::TokioIo;
use system::{cache::WebCache, net::Stream}; use system::{
cache::WebCache,
net::{
Server, Stream,
tcp::*,
tls::*,
},
};
#[derive(Clone)] #[derive(Clone)]
struct HttpServiceArgs { struct HttpServiceArgs {
@ -65,7 +72,8 @@ async fn service_http(mut request:hyper::Request<hyper::body::Incoming>, args:Ht
} }
} }
async fn handle_http(stream:system::net::tls::TlsStream, addr:SocketAddr, args:HttpServiceArgs) -> Result<(),()> async fn handle_http<S>(stream:S, addr:SocketAddr, args:HttpServiceArgs) -> Result<(),()>
where S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin + Send + 'static
// Hand off socket connection to Hyper server. // Hand off socket connection to Hyper server.
// //
{ {
@ -74,7 +82,7 @@ async fn handle_http(stream:system::net::tls::TlsStream, addr:SocketAddr, args:H
println!("Connection from {}", addr.to_string()); println!("Connection from {}", addr.to_string());
let io = TokioIo::new(stream.to_stream()); let io = TokioIo::new(stream);
let conn = http1::Builder::new() let conn = http1::Builder::new()
.serve_connection(io, service_fn(move |req| { .serve_connection(io, service_fn(move |req| {
@ -85,15 +93,21 @@ async fn handle_http(stream:system::net::tls::TlsStream, addr:SocketAddr, args:H
Ok(()) Ok(())
} }
async fn handle_tcp(stream:TcpStream, addr:SocketAddr, args:HttpServiceArgs) -> Result<(),()>
{
handle_http(stream.to_stream(), addr, args).await
}
async fn handle_tls(stream:TlsStream, addr:SocketAddr, args:HttpServiceArgs) -> Result<(),()>
{
handle_http(stream.to_stream(), addr, args).await
}
#[tokio::main(flavor = "multi_thread", worker_threads = 12)] #[tokio::main(flavor = "multi_thread", worker_threads = 12)]
async fn main() async fn main()
{ {
use system::net::{
Server,
tls::*,
};
// Initialize application data. // Initialize application data.
let app; let app;
if let Ok(result) = App::init() { if let Ok(result) = App::init() {
@ -171,22 +185,40 @@ async fn main()
} }
} }
let mut server = TlsServer::new(); let mut tcp_server = TcpServer::new();
if server.add_cert("omen.kirisame.com", "cert/fullchain.pem", "cert/privkey.pem").await.is_ok() { match tcp_server.bind("127.0.0.1:38611").await {
println!("Loaded cert file.");
}
match server.bind("0.0.0.0:38612").await {
Ok(_) => { Ok(_) => {
println!("Listener bind successful."); let b = bus.connect().unwrap();
let c = cache.clone();
tokio::spawn(async move { tokio::spawn(async move {
while server.accept(handle_http, HttpServiceArgs { while tcp_server.accept(handle_tcp, HttpServiceArgs {
bus:bus.connect().unwrap(), bus:b.connect().unwrap(),
cache:cache.clone(), cache:c.clone(),
}).await.is_ok() { } }).await.is_ok() { }
}); });
} }
Err(_) => { Err(_) => {
println!("error: failed to bind port 38612."); println!("error: failed to bind TCP port 38611.");
}
}
let mut tls_server = TlsServer::new();
if tls_server.add_cert("omen.kirisame.com", "cert/fullchain.pem", "cert/privkey.pem").await.is_err() {
println!("error: failed to load TLS certificates.");
}
match tls_server.bind("0.0.0.0:38612").await {
Ok(_) => {
let b = bus.connect().unwrap();
let c = cache.clone();
tokio::spawn(async move {
while tls_server.accept(handle_tls, HttpServiceArgs {
bus:b.connect().unwrap(),
cache:c.clone(),
}).await.is_ok() { }
});
}
Err(_) => {
println!("error: failed to bind TLS port 38612.");
} }
} }
} }