v2.0 and auth abuse

This commit is contained in:
MeexReay 2025-02-12 02:38:52 +03:00
parent 9c2fe34303
commit 0111c27389
5 changed files with 27 additions and 33 deletions

View File

@ -13,7 +13,7 @@ better RAC client
- plays sound when users receive your messages
- coloring usernames by their clients (CRAB, clRAC, Mefidroniy, etc)
- configurable message format
- RACv1.99.x compatible
- RACv1.99.x and RACv2.0 compatible
![image](https://github.com/user-attachments/assets/a2858662-50f1-4554-949c-f55addf48fcc)
@ -71,8 +71,9 @@ max_messages: 100 # chat messages limit
## see also
- [RAC protocol (v1.99.2)](https://gitea.bedohswe.eu.org/pixtaded/crab#rac-protocol)
- [RAC protocol (v2.0)](https://gitea.bedohswe.eu.org/pixtaded/crab#rac-protocol)
- [CRAB - client & server for RAC](https://gitea.bedohswe.eu.org/pixtaded/crab)
- [Mefidroniy - client for RAC](https://github.com/OctoBanon-Main/mefedroniy-client)
- [Colored usernames](https://github.com/MeexReay/bRAC/blob/main/docs/colored_usernames.md)
- [AlmatyD - server for RAC](https://gitea.bedohswe.eu.org/bedohswe/almatyd)
- [AlmatyD - server for RACv1.0](https://gitea.bedohswe.eu.org/bedohswe/almatyd)
- [RAC protocol (v1.0)](https://bedohswe.eu.org/text/rac/protocol.md.html)

View File

@ -1 +0,0 @@
todo

View File

@ -161,15 +161,15 @@ pub fn print_console(ctx: Arc<Context>, messages: Vec<String>, input: &str) -> R
fn prepare_message(context: Arc<Context>, message: &str) -> String {
format!("{}{}{}",
format!("{}{}{}\r",
if !context.disable_hiding_ip {
"\r\x07"
} else {
""
},
message,
if !context.disable_hiding_ip && message.chars().count() < 39 {
" ".repeat(39-message.chars().count())
if !context.disable_hiding_ip && message.chars().count() < 53 {
" ".repeat(53-message.chars().count())
} else {
String::new()
}
@ -300,12 +300,12 @@ fn poll_events(ctx: Arc<Context>) -> Result<(), Box<dyn Error>> {
if message.starts_with("/") && !ctx.disable_commands {
on_command(ctx.clone(), &message)?;
} else {
if let Some(password) = &ctx.auth_password {
send_message_auth(&ctx.host, &ctx.name, password, &message)?;
let message = prepare_message(ctx.clone(), &ctx.message_format
.replace("{name}", &ctx.name)
.replace("{text}", &message));
if ctx.auth {
send_message_auth(&ctx.host, &message)?;
} else {
let message = ctx.message_format
.replace("{name}", &ctx.name)
.replace("{text}", &message);
send_message(&ctx.host, &message)?;
}
}

View File

@ -174,8 +174,8 @@ pub struct Args {
pub configure: bool,
/// Authentication password
#[arg(short='a', long, value_name="PASSWORD")]
pub auth: Option<String>,
#[arg(short='a', long)]
pub auth: bool,
}
pub struct Context {
@ -191,7 +191,7 @@ pub struct Context {
pub max_messages: usize,
pub enable_ip_viewing: bool,
pub scroll: Arc<AtomicUsize>,
pub auth_password: Option<String>,
pub auth: bool,
}
impl Context {
@ -209,7 +209,7 @@ impl Context {
max_messages: config.max_messages,
enable_ip_viewing: args.enable_users_ip_viewing || config.enable_ip_viewing,
scroll: Arc::new(AtomicUsize::new(0)),
auth_password: args.auth.clone()
auth: args.auth
}
}
}

View File

@ -9,37 +9,31 @@ pub fn send_message(host: &str, message: &str) -> Result<(), Box<dyn Error>> {
Ok(())
}
pub fn send_message_auth(host: &str, name: &str, password: &str, message: &str) -> Result<(), Box<dyn Error>> {
pub fn send_message_auth(host: &str, message: &str) -> Result<(), Box<dyn Error>> {
register_user(host, message, message)?;
let mut stream = TcpStream::connect(host)?;
stream.write_all(&[0x02])?;
stream.write_all(name.as_bytes())?;
stream.write_all(&[b'\n'])?;
stream.write_all(password.as_bytes())?;
stream.write_all(message.as_bytes())?;
stream.write_all(&[b'\n'])?;
stream.write_all(message.as_bytes())?;
stream.write_all(b"\n\r ")?;
let mut buf = vec![0; 1];
stream.read_exact(&mut buf)?;
if buf[0] == 0x01 {
register_user(host, name, password)?;
send_message_auth(host, name, password, message)?
} else if buf[0] == 0x02 {
println!("Password is incorrect");
panic!()
if let Ok(_) = stream.read_exact(&mut buf) {
if buf[0] == 0x02 {
let message = format!("\x1f{message}");
register_user(host, &message, &message)?;
send_message_auth(host, &message)?;
}
}
Ok(())
}
pub fn register_user(host: &str, name: &str, password: &str) -> Result<(), Box<dyn Error>> {
let mut stream = TcpStream::connect(host)?;
stream.write_all(&[0x00])?;
stream.write_all(&[0x03])?;
stream.write_all(name.as_bytes())?;
stream.write_all(&[b'\n'])?;
stream.write_all(password.as_bytes())?;
// let mut buf = vec![0; 1];
// stream.read(&mut buf)?;
// if buf[0] == 0x01 {
// // похуй
// }
Ok(())
}