mirror of
https://github.com/MeexReay/sRAC.git
synced 2025-06-24 02:22:57 +03:00
move proto stuff to the new module + add splash.txt
This commit is contained in:
parent
ff3e779962
commit
9fc712db85
9
splash.txt
Normal file
9
splash.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[7m[38;5;236m [0m[38;5;1;48;5;236m [38;5;242;48;5;237m▗[38;5;243;48;5;239m▆[48;5;244m [38;5;244;48;5;241m▇[38;5;242;48;5;238m▄[38;5;236;48;5;237m╴[48;5;236m [38;5;238;48;5;246m▊[38;5;244;48;5;188m▗[38;5;145;48;5;240m▍[38;5;239;48;5;248m▍[38;5;246;48;5;251m▖[38;5;102;48;5;237m▏[38;5;250;48;5;238m▄[38;5;248;48;5;239m━[38;5;238;48;5;237m╴[48;5;236m [38;5;237;48;5;243m▋[38;5;239;48;5;250m╺[38;5;251;48;5;242m▁[38;5;248;48;5;239m▘[38;5;251;48;5;238m▗[38;5;242;48;5;237m▖[38;5;251;48;5;239m▗[38;5;243;48;5;238m▏[38;5;247;48;5;236m▅[38;5;248;48;5;237m▅[38;5;246;48;5;239m▖[38;5;248;48;5;237m▄[38;5;247;48;5;236m▅[38;5;248;48;5;237m▖[38;5;251;48;5;239m▗[38;5;246;48;5;238m▄[38;5;250m▄[38;5;249;48;5;240m╼[38;5;246;48;5;237m▄[38;5;237;48;5;241m▉[38;5;248;48;5;59m┲[38;5;145;48;5;238m▄[38;5;239;48;5;237m▏[0m
|
||||||
|
[7m[38;5;236m [0m[38;5;243;48;5;239m▗[48;5;244m [38;5;250m▂[38;5;254;48;5;102m▃[38;5;253m▃[48;5;244m▂[48;5;102m▂[38;5;255m▃[38;5;254m▂[38;5;246;48;5;244m▁ [38;5;239;48;5;243m▝[48;5;237m▏[48;5;236m [38;5;237;48;5;249m▌[38;5;248;48;5;237m▌[38;5;240;48;5;248m▖[38;5;248;48;5;59m▌[38;5;239;48;5;252m▌[38;5;246;48;5;240m▎[38;5;250;48;5;238m▊[38;5;236m╵[38;5;246;48;5;237m▂[48;5;236m [38;5;102m▗[38;5;250;48;5;240m▂[38;5;242;48;5;252m▇[38;5;250;48;5;243m▊[38;5;239;48;5;251m▌[38;5;247;48;5;239m▎[38;5;241;48;5;250m▎[38;5;240;48;5;246m▊[38;5;244;48;5;248m╻[38;5;241;48;5;247m▃[38;5;240;48;5;244m▉[38;5;250;48;5;241m▋[38;5;247;48;5;238m▂[38;5;250;48;5;242m▋[38;5;59;48;5;250m▍[38;5;246;48;5;236m▎[38;5;240;48;5;250m▎[38;5;242;48;5;237m▎[38;5;249;48;5;238m▉[38;5;145;48;5;239m▗[38;5;240;48;5;247m▗[38;5;244;48;5;252m▍[38;5;243;48;5;237m▍[0m
|
||||||
|
[38;5;240;48;5;237m▗[38;5;242;48;5;244m▏ [38;5;254;48;5;246m▗[48;5;231m [38;5;246;48;5;254m▝[48;5;244m▏ [38;5;243;48;5;238m▌[48;5;236m [38;5;237;48;5;244m▇[48;5;59m▇[38;5;236;48;5;237m▇▇[38;5;237;48;5;244m▇[38;5;236;48;5;242m▆[48;5;246m▆[48;5;237m╴[48;5;102m▆[48;5;236m [48;5;237m╴[48;5;247m▆[48;5;250m▆[38;5;237;48;5;242m▇[48;5;59m▇[38;5;236;48;5;250m▆[48;5;247m▆[38;5;239;48;5;246m▊[38;5;240;48;5;248m▁[48;5;247m▁[38;5;249;48;5;239m▘[38;5;236;48;5;244m▆[48;5;250m▆[38;5;237;48;5;240m▇[38;5;236;48;5;102m▆[48;5;237m╴[48;5;246m▆[38;5;237;48;5;239m▇[38;5;236;48;5;246m▆[48;5;237m╴[48;5;250m▆[48;5;248m▆[48;5;237m╴[0m
|
||||||
|
[38;5;237;48;5;243m▋[48;5;244m [38;5;244;48;5;248m▊[38;5;251;48;5;255m▏[48;5;231m [38;5;244;48;5;188m▗[38;5;246;48;5;255m▆[38;5;255;48;5;231m▏[38;5;246;48;5;254m▗[38;5;244m▆[38;5;253;48;5;231m▎ [38;5;252;48;5;102m▌[48;5;244m [38;5;243;48;5;238m▊[48;5;236m [0m
|
||||||
|
[38;5;240;48;5;237m▝[38;5;242;48;5;244m▏ [38;5;244;48;5;250m▊[38;5;253;48;5;231m▁ [38;5;254;48;5;251m▇[38;5;255;48;5;248m▇[38;5;254;48;5;231m▁[38;5;255;48;5;253m▇[38;5;254;48;5;246m▇[48;5;231m▏[38;5;255m▁[38;5;254;48;5;246m▌[48;5;244m [38;5;243;48;5;238m▌[48;5;236m [38;5;242;48;5;237m▗[38;5;246;48;5;236m▄▄▄ [0m
|
||||||
|
[7m[38;5;236m [0m[38;5;243;48;5;239m▝[48;5;244m [38;5;244;48;5;249m▇[48;5;253m▅[38;5;254;48;5;244m▘[38;5;244;48;5;247m▇[48;5;145m▇[48;5;248m▇[38;5;250;48;5;244m▝[38;5;102;48;5;255m▅[38;5;244;48;5;251m▆[48;5;244m [38;5;239;48;5;243m▗[48;5;237m▏[48;5;236m [38;5;250;48;5;239m▝[38;5;249m▃[38;5;248;48;5;237m▃[38;5;247;48;5;243m▋[48;5;236m [38;5;237;48;5;238m▊[38;5;249;48;5;242m┓[38;5;250;48;5;238m▁[38;5;102m▋[38;5;242;48;5;237m╺[38;5;244;48;5;242m▁[38;5;246;48;5;238m▆[38;5;237;48;5;242m▉[38;5;247;48;5;238m▌[38;5;237;48;5;242m▉[38;5;246;48;5;238m▌[48;5;240m▗[38;5;243;48;5;238m▂[38;5;247m▆[38;5;238;48;5;242m▉[38;5;247;48;5;241m▖[38;5;102;48;5;240m▘[38;5;246;48;5;239m╸[38;5;237;48;5;102m▖[38;5;236;48;5;244m▗[48;5;237m╴[38;5;237;48;5;238m▉[38;5;59m▖[38;5;240;48;5;237m▁[38;5;239m▁[38;5;240m▁[38;5;242;48;5;238m▗[38;5;239;48;5;237m┎[0m
|
||||||
|
[7m[38;5;236m [0m[38;5;1;48;5;236m [38;5;242;48;5;237m▝[38;5;239;48;5;243m▂[48;5;244m [38;5;241m▁[38;5;238;48;5;242m▄[38;5;236;48;5;237m╴[48;5;236m [38;5;248;48;5;238m▗[48;5;240m▘[38;5;237;48;5;59m▉[38;5;244;48;5;239m▉[48;5;236m [38;5;237;48;5;238m▊[38;5;247m▊[38;5;238;48;5;249m▇[38;5;246;48;5;237m▊[38;5;238;48;5;102m▌[38;5;239;48;5;244m┗[38;5;243;48;5;248m▍[38;5;238;48;5;244m▉[48;5;248m▝[38;5;249;48;5;239m▂[38;5;145;48;5;240m▋[38;5;240;48;5;248m▌[38;5;237;48;5;102m▗[38;5;239m▎[38;5;238;48;5;243m▊[38;5;237;48;5;246m▝[38;5;247;48;5;238m▃[38;5;244m╴[38;5;238;48;5;244m▋[38;5;247;48;5;237m▍[48;5;236m [38;5;237;48;5;239m▋[38;5;240;48;5;238m▌[38;5;239;48;5;59m▎[38;5;238;48;5;240m▗[48;5;59m▎[38;5;239;48;5;242m▌[38;5;238;48;5;240m▍[0m
|
||||||
|
[7m[38;5;236m [0m[38;5;1;48;5;236m [38;5;236;48;5;237m╴[38;5;237;48;5;242m▆[48;5;243m▄[38;5;238;48;5;244m▃▂[38;5;236;48;5;243m▁▁[38;5;239;48;5;244m▃[38;5;237;48;5;243m▃[48;5;242m▅[48;5;239m▇[48;5;236m [38;5;236;48;5;237m▇[48;5;236m [48;5;237m▇[48;5;236m [48;5;237m▇[48;5;236m [48;5;237m▇[48;5;236m [48;5;238m▇[48;5;237m▇[48;5;236m [48;5;238m▇▇[38;5;248m▝[38;5;236;48;5;237m▇[48;5;236m [48;5;237m▇[48;5;236m [48;5;237m▇[48;5;238m▇[48;5;236m [48;5;239m▆[48;5;237m▇▇▇▇▇[0m
|
||||||
|
[?25h
|
@ -26,7 +26,7 @@ pub struct Context {
|
|||||||
pub messages: RwLock<Vec<u8>>,
|
pub messages: RwLock<Vec<u8>>,
|
||||||
pub accounts: RwLock<Vec<Account>>,
|
pub accounts: RwLock<Vec<Account>>,
|
||||||
pub messages_offset: AtomicU64,
|
pub messages_offset: AtomicU64,
|
||||||
pub notifications: RwLock<HashMap<u32, Vec<u8>>>,
|
pub notifications: RwLock<HashMap<u32, Vec<u8>>>, // u32 - ip
|
||||||
pub timeouts: RwLock<HashMap<u32, Duration>>,
|
pub timeouts: RwLock<HashMap<u32, Duration>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
125
src/main.rs
125
src/main.rs
@ -1,30 +1,16 @@
|
|||||||
use std::{
|
use std::{fs, sync::Arc};
|
||||||
error::Error,
|
|
||||||
fs,
|
|
||||||
io::{Read, Write},
|
|
||||||
net::{SocketAddr, TcpListener},
|
|
||||||
sync::Arc,
|
|
||||||
thread,
|
|
||||||
};
|
|
||||||
|
|
||||||
use log::{debug, info};
|
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use rustls::{
|
use log::info;
|
||||||
ServerConfig, ServerConnection, StreamOwned,
|
|
||||||
pki_types::{CertificateDer, PrivateKeyDer, pem::PemObject},
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ctx::{Account, Context},
|
ctx::{Account, Context},
|
||||||
rac::accept_rac_stream,
|
proto::run_listener,
|
||||||
wrac::accept_wrac_stream,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
mod ctx;
|
pub mod ctx;
|
||||||
mod logic;
|
pub mod logic;
|
||||||
mod rac;
|
pub mod proto;
|
||||||
mod wrac;
|
|
||||||
|
|
||||||
fn load_accounts(accounts_file: Option<String>) -> Vec<Account> {
|
fn load_accounts(accounts_file: Option<String>) -> Vec<Account> {
|
||||||
if let Some(accounts_file) = accounts_file.clone() {
|
if let Some(accounts_file) = accounts_file.clone() {
|
||||||
@ -55,100 +41,9 @@ fn load_messages(messages_file: Option<String>) -> Vec<u8> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn accept_stream(
|
|
||||||
stream: impl Read + Write,
|
|
||||||
addr: SocketAddr,
|
|
||||||
ctx: Arc<Context>,
|
|
||||||
) -> Result<(), Box<dyn Error>> {
|
|
||||||
if ctx.args.enable_wrac {
|
|
||||||
accept_wrac_stream(stream, addr, ctx)?;
|
|
||||||
} else {
|
|
||||||
accept_rac_stream(stream, addr, ctx)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run_normal_listener(ctx: Arc<Context>) {
|
|
||||||
let listener =
|
|
||||||
TcpListener::bind(&ctx.args.host).expect("error trying bind to the provided addr");
|
|
||||||
|
|
||||||
for stream in listener.incoming() {
|
|
||||||
let Ok(stream) = stream else { continue };
|
|
||||||
|
|
||||||
let ctx = ctx.clone();
|
|
||||||
|
|
||||||
thread::spawn(move || {
|
|
||||||
let Ok(addr) = stream.peer_addr() else {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
match accept_stream(stream, addr, ctx) {
|
|
||||||
Ok(_) => {}
|
|
||||||
Err(e) => {
|
|
||||||
debug!("{}", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run_secure_listener(ctx: Arc<Context>) {
|
|
||||||
let listener =
|
|
||||||
TcpListener::bind(&ctx.args.host).expect("error trying bind to the provided addr");
|
|
||||||
|
|
||||||
let server_config = Arc::new(
|
|
||||||
ServerConfig::builder()
|
|
||||||
.with_no_client_auth()
|
|
||||||
.with_single_cert(
|
|
||||||
CertificateDer::pem_file_iter(
|
|
||||||
ctx.args.ssl_cert.clone().expect("--ssl-cert is required"),
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
.map(|cert| cert.unwrap())
|
|
||||||
.collect(),
|
|
||||||
PrivateKeyDer::from_pem_file(
|
|
||||||
ctx.args.ssl_key.clone().expect("--ssl-key is required"),
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
|
|
||||||
for stream in listener.incoming() {
|
|
||||||
let Ok(stream) = stream else { continue };
|
|
||||||
|
|
||||||
let ctx = ctx.clone();
|
|
||||||
let server_config = server_config.clone();
|
|
||||||
|
|
||||||
thread::spawn(move || {
|
|
||||||
let Ok(addr) = stream.peer_addr() else {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
let Ok(connection) = ServerConnection::new(server_config) else {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
let mut stream = StreamOwned::new(connection, stream);
|
|
||||||
|
|
||||||
while stream.conn.is_handshaking() {
|
|
||||||
let Ok(_) = stream.conn.complete_io(&mut stream.sock) else {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
match accept_stream(stream, addr, ctx) {
|
|
||||||
Ok(_) => {}
|
|
||||||
Err(e) => {
|
|
||||||
debug!("{}", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[command(version)]
|
#[command(version)]
|
||||||
struct Args {
|
pub struct Args {
|
||||||
/// Server host
|
/// Server host
|
||||||
#[arg(short = 'H', long)]
|
#[arg(short = 'H', long)]
|
||||||
host: String,
|
host: String,
|
||||||
@ -219,9 +114,5 @@ fn main() {
|
|||||||
|
|
||||||
info!("Server started on {}", &args.host);
|
info!("Server started on {}", &args.host);
|
||||||
|
|
||||||
if args.enable_ssl {
|
run_listener(context);
|
||||||
run_secure_listener(context);
|
|
||||||
} else {
|
|
||||||
run_normal_listener(context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
120
src/proto/mod.rs
Normal file
120
src/proto/mod.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
use std::{
|
||||||
|
error::Error,
|
||||||
|
io::{Read, Write},
|
||||||
|
net::{SocketAddr, TcpListener},
|
||||||
|
sync::Arc,
|
||||||
|
thread,
|
||||||
|
};
|
||||||
|
|
||||||
|
use log::debug;
|
||||||
|
use rustls::{
|
||||||
|
ServerConfig, ServerConnection, StreamOwned,
|
||||||
|
pki_types::{CertificateDer, PrivateKeyDer, pem::PemObject},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
ctx::Context,
|
||||||
|
proto::{rac::accept_rac_stream, wrac::accept_wrac_stream},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub mod rac;
|
||||||
|
pub mod wrac;
|
||||||
|
|
||||||
|
fn accept_stream(
|
||||||
|
stream: impl Read + Write,
|
||||||
|
addr: SocketAddr,
|
||||||
|
ctx: Arc<Context>,
|
||||||
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
if ctx.args.enable_wrac {
|
||||||
|
accept_wrac_stream(stream, addr, ctx)?;
|
||||||
|
} else {
|
||||||
|
accept_rac_stream(stream, addr, ctx)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_normal_listener(ctx: Arc<Context>) {
|
||||||
|
let listener =
|
||||||
|
TcpListener::bind(&ctx.args.host).expect("error trying bind to the provided addr");
|
||||||
|
|
||||||
|
for stream in listener.incoming() {
|
||||||
|
let Ok(stream) = stream else { continue };
|
||||||
|
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
let Ok(addr) = stream.peer_addr() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
match accept_stream(stream, addr, ctx) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
debug!("{}", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_secure_listener(ctx: Arc<Context>) {
|
||||||
|
let listener =
|
||||||
|
TcpListener::bind(&ctx.args.host).expect("error trying bind to the provided addr");
|
||||||
|
|
||||||
|
let server_config = Arc::new(
|
||||||
|
ServerConfig::builder()
|
||||||
|
.with_no_client_auth()
|
||||||
|
.with_single_cert(
|
||||||
|
CertificateDer::pem_file_iter(
|
||||||
|
ctx.args.ssl_cert.clone().expect("--ssl-cert is required"),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.map(|cert| cert.unwrap())
|
||||||
|
.collect(),
|
||||||
|
PrivateKeyDer::from_pem_file(
|
||||||
|
ctx.args.ssl_key.clone().expect("--ssl-key is required"),
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
|
for stream in listener.incoming() {
|
||||||
|
let Ok(stream) = stream else { continue };
|
||||||
|
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
let server_config = server_config.clone();
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
let Ok(addr) = stream.peer_addr() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let Ok(connection) = ServerConnection::new(server_config) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let mut stream = StreamOwned::new(connection, stream);
|
||||||
|
|
||||||
|
while stream.conn.is_handshaking() {
|
||||||
|
let Ok(_) = stream.conn.complete_io(&mut stream.sock) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
match accept_stream(stream, addr, ctx) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
debug!("{}", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_listener(ctx: Arc<Context>) {
|
||||||
|
if ctx.args.enable_ssl {
|
||||||
|
run_secure_listener(ctx);
|
||||||
|
} else {
|
||||||
|
run_normal_listener(ctx);
|
||||||
|
}
|
||||||
|
}
|
@ -38,13 +38,13 @@ pub fn accept_rac_stream(
|
|||||||
)?)?;
|
)?)?;
|
||||||
}
|
}
|
||||||
} else if buf[0] == 0x01 {
|
} else if buf[0] == 0x01 {
|
||||||
let mut buf = vec![0; 1024];
|
let mut buf = vec![0; ctx.args.message_limit];
|
||||||
let size = stream.read(&mut buf)?;
|
let size = stream.read(&mut buf)?;
|
||||||
buf.truncate(size);
|
buf.truncate(size);
|
||||||
|
|
||||||
on_send_message(ctx.clone(), addr.clone(), buf)?;
|
on_send_message(ctx.clone(), addr.clone(), buf)?;
|
||||||
} else if buf[0] == 0x02 {
|
} else if buf[0] == 0x02 {
|
||||||
let mut buf = vec![0; 8192];
|
let mut buf = vec![0; ctx.args.message_limit + 2 + 512]; // FIXME: softcode this (512 = name + password)
|
||||||
let size = stream.read(&mut buf)?;
|
let size = stream.read(&mut buf)?;
|
||||||
buf.truncate(size);
|
buf.truncate(size);
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user