Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
tam4m0 authored Mar 19, 2022
1 parent 302ec0c commit f758199
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 56 deletions.
5 changes: 3 additions & 2 deletions cnf.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
[main]
version = "0.2.0"
version = "0.2.0 'Cowboys from Hell'"
prefix = "/"

[server]
host = "127.0.0.1"
port = "5000"
password = ""
password = "SuperAdmin"
trackspath = ""
admins = ""
gametype = ""
168 changes: 121 additions & 47 deletions loops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ pub mod messages;
#[path="./structs.rs"]
pub mod structs;
use std::str;
use std::usize;
use std::net::TcpStream;
use std::sync::{Arc,Mutex};
use aho_corasick::AhoCorasick;
Expand All @@ -21,88 +20,163 @@ pa")),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
handler
}

fn ban(socket: Arc<Mutex<TcpStream>>, mut handler: Arc<Mutex<u32>>, cnfroot: &Config, user: String) -> Arc<Mutex<u32>> {
if &cnfroot.server.gametype == "forever" {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn BanAndBlackList
pa
paa va str {}
paa va str The ban hammer has spoken!
paa va bool true",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
} else {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn Ban
pa
paa va str {}",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}
handler
}

fn kick(socket: Arc<Mutex<TcpStream>>, mut handler: Arc<Mutex<u32>>, cnfroot: &Config, user: String) -> Arc<Mutex<u32>> {
if &cnfroot.server.gametype == "forever" {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn Kick
pa
paa va str {}
paa va str Get outta here!",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
} else {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn Kick
pa
paa va str {}",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}
handler
}

fn user_list(socket: Arc<Mutex<TcpStream>>, mut handler: Arc<Mutex<u32>>, cnfroot: &Config, user: String) -> Arc<Mutex<u32>> {
if &cnfroot.server.gametype == "forever" {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn GetPlayerList
pa
paa va i4 9999
paa va i4 0
paa va i4 0")),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
let message = messages::listen(Arc::clone(&socket));
let (meth_name, meth_argv) = messages::reverse_xmlrpc(&message);
if meth_name == "" {
for x in meth_argv.iter().filter(|x| !x.parse::<u32>().is_ok()).collect::<Vec<&String>>() {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn ChatSendToLogin
pa
paa va str {}
paa va str {}",if x == "-1" { continue; } else { &x },user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}
}
} else {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn GetPlayerList
pa
paa va i4 9999
paa va i4 0")),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
let message = messages::listen(Arc::clone(&socket));
let (meth_name, meth_argv) = messages::reverse_xmlrpc(&message);
if meth_name == "" {
for x in meth_argv.iter().filter(|x| !x.parse::<u32>().is_ok()).collect::<Vec<&String>>() {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn ChatSendToLogin
pa
paa va str {}
paa va str {}",if x == "-1" { continue; } else { &x },user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}
}
}
handler
}

fn chall_list(socket: Arc<Mutex<TcpStream>>, mut handler: Arc<Mutex<u32>>, cnfroot: &Config, user: String) -> Arc<Mutex<u32>> {
for e in glob(format!("{}/{}",cnfroot.server.trackspath,"*").as_str()).unwrap() {
if e.as_ref().unwrap().display().to_string().contains(".Gbx") {
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn ChatSendToLogin
pa
paa va str {:?}
paa va str {}
paa va str {}",&e.as_ref().unwrap().display().to_string().as_str()[e.as_ref().unwrap().display().to_string().rfind("/").unwrap()+1..].to_string(),user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1
}
}
handler
}

pub fn event(socket: Arc<Mutex<TcpStream>>, mut handler: Arc<Mutex<u32>>, cnfroot: &Config) {
let ac_admins = AhoCorasick::new_auto_configured(&cnfroot.server.admins.split(":").collect::<Vec<&str>>());
let ac_useractions = AhoCorasick::new_auto_configured(&["kick", "ban"]);
let admins = &cnfroot.server.admins.split("**").collect::<Vec<&str>>();
let ac_useractions = AhoCorasick::new_auto_configured(&["kick", "ban", "list"]);
let ac_challactions = AhoCorasick::new_auto_configured(&["skip","remove","insert","list"]);
loop {
let message = messages::listen(Arc::clone(&socket));
if message.contains("methodResponse") {
continue;
} else {
let (meth_name, meth_argv) = messages::reverse_xmlrpc(message);
if meth_name.starts_with("TrackMania.PlayerChat") {
if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("echo"))[..]) {
let cmd = &format!("{}{}",&cnfroot.main.prefix,String::from("echo"));
let user = &meth_argv[1];
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
let (meth_name, meth_argv) = messages::reverse_xmlrpc(&message);
if meth_name.starts_with("TrackMania.PlayerChat") {
if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("echo"))[..]) {
let cmd = &format!("{}{}",&cnfroot.main.prefix,String::from("echo"));
let user = &meth_argv[1];
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn ChatSendToLogin
pa
paa va str {}
paa va str {}",meth_argv[2].split(" ").collect::<Vec<&str>>()[1..].join(" "),user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("hacktheplanet"))[..]) {
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("hacktheplanet"))[..]) {
if &cnfroot.server.gametype == "forever" {
let user = &meth_argv[1];
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn Kick
pa
paa va str {}
paa va str The CIA has arrested you for hacking, GG.",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("user"))[..]) {
} else {
let user = &meth_argv[1];
let argstr = &meth_argv[2].split(" ").collect::<Vec<&str>>()[1..];
if !argstr.is_empty() {
if ac_admins.is_match(user) {
if ac_useractions.is_match(argstr[0]) {
let mat = ac_useractions.find(argstr[0]).unwrap();
match mat {
_ if mat.pattern() == 1 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn BanAndBlackList
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn ChatSendToLogin
pa
paa va str {}
paa va str The ban hammer has spoken!
paa va bool true",argstr[1])),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1,
_ if mat.pattern() == 0 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
paa va str The CIA has arrested you for hacking, GG.
paa va str {}",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn Kick
pa
paa va str {}
paa va str Get outta here!",argstr[1])),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1,
_ => nop(),
};
}
paa va str {}",user)),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1;
}
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("user"))[..]) {
let user = &meth_argv[1];
let argstr = &meth_argv[2].split(" ").collect::<Vec<&str>>()[1..];
if !argstr.is_empty() {
if admins.contains(&user.as_str()) {
if ac_useractions.is_match(argstr[0]) {
let mat = ac_useractions.find(argstr[0]).unwrap();
match mat {
_ if mat.pattern() == 0 => handler = kick(Arc::clone(&socket),Arc::clone(&handler),&cnfroot,argstr[1].to_string()),
_ if mat.pattern() == 1 => handler = ban(Arc::clone(&socket),Arc::clone(&handler),&cnfroot,argstr[1].to_string()),
_ if mat.pattern() == 2 => handler = user_list(Arc::clone(&socket),Arc::clone(&handler),&cnfroot,user.to_string()),
_ => nop(),
};
}
}
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("chall"))[..]) {
let user = &meth_argv[1];
let argstr = &meth_argv[2].split(" ").collect::<Vec<&str>>()[1..];
if !argstr.is_empty() {
println!("{}/{}",&cnfroot.server.trackspath,argstr[1..].join(" "));
if ac_admins.is_match(user) {
if ac_challactions.is_match(argstr[0]) {
let mat = ac_challactions.find(argstr[0]).unwrap();
match mat {
_ if mat.pattern() == 0 => handler = skipToChallenge(Arc::clone(&socket),Arc::clone(&handler),format!("{}/{}",&cnfroot.server.trackspath,argstr[1..].join(" "))),
_ if mat.pattern() == 1 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
}
}if meth_argv[2].starts_with(&format!("{}{}",&cnfroot.main.prefix,String::from("chall"))[..]) {
let user = &meth_argv[1];
let argstr = &meth_argv[2].split(" ").collect::<Vec<&str>>()[1..];
if !argstr.is_empty() {
println!("{}",user);
println!("{:#?}",admins);
if admins.contains(&user.as_str()) {
if ac_challactions.is_match(argstr[0]) {
let mat = ac_challactions.find(argstr[0]).unwrap();
match mat {
_ if mat.pattern() == 0 => handler = skipToChallenge(Arc::clone(&socket),Arc::clone(&handler),format!("{}/{}",&cnfroot.server.trackspath,argstr[1..].join(" "))),
_ if mat.pattern() == 1 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn RemoveChallenge
paa va str {}",format!("{}/{}",&cnfroot.server.trackspath,argstr[1..].join(" ")))),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1,
_ if mat.pattern() == 2 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
_ if mat.pattern() == 2 => handler = messages::send_message(messages::transform_xmlrpc(format!("mc
mn InsertChallenge
paa va str {}",format!("{}/{}",&cnfroot.server.trackspath,argstr[1..].join(" ")))),Arc::clone(&socket),Arc::clone(&handler)).unwrap().1,
_ if mat.pattern() == 3 => handler = chall_list(Arc::clone(&socket),Arc::clone(&handler),cnfroot,user.to_string()),
_ => nop(),
}
_ if mat.pattern() == 3 => handler = chall_list(Arc::clone(&socket),Arc::clone(&handler),cnfroot,user.to_string()),
_ => nop(),
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,26 @@ use aho_corasick::AhoCorasick;
#[path="./structs.rs"]
pub mod structs;

pub fn reverse_xmlrpc(message: String) -> (String,Vec<String>) {
pub fn reverse_xmlrpc(message: &String) -> (String,Vec<String>) {
let xmllist = message.split("\n").collect::<Vec<&str>>();
let ac_types = AhoCorasick::new_auto_configured(&["<string>","<boolean>","<i4>"]);
let ac_endtypes = AhoCorasick::new_auto_configured(&["</string>","</boolean>","</i4>"]);
let ac_types = AhoCorasick::new_auto_configured(&["<string>","<boolean>","<i4>","<struct>"]);
let ac_endtypes = AhoCorasick::new_auto_configured(&["</string>","</boolean>","</i4>","</struct>"]);
let mut methodName = String::new();
let mut argv = Vec::new();
if xmllist[0].starts_with("<?xml") {
if xmllist[1].starts_with("<methodCall>") {
if xmllist[1].starts_with("<methodCall>") || xmllist[1].starts_with("<methodResponse>") {
for x in &xmllist[2..] {
if x.starts_with("<methodName>") {
methodName.push_str(&x[x.find(">").unwrap()+1..x.rfind("<").unwrap()]);
} if x.starts_with("<params>") { continue; }
if x.starts_with("<param><value>") {
if x.contains("<value>") || x.starts_with("<param><value>") {
let mut mat = if ac_types.find(x).is_some() { ac_types.find(x).unwrap() } else { continue; };
let mut mat2 = if ac_endtypes.find(x).is_some() { ac_endtypes.find(x).unwrap() } else { continue; };
argv.push(String::from(&x[mat.end()..mat2.start()]));
}
}
} else { return (String::from("Invalid XML-RPC"),vec![String::from("Invalid XML-RPC")]); }
} else { return (String::from("Invalid XML-RPC"),vec![String::from("Invalid XML-RPC")]); }
} else { return (String::from("Invalid XML-RPC, check server output"),vec![String::from("Invalid XML-RPC, check server output")]); }
} else { return (String::from("Invalid XML-RPC, check server output"),vec![String::from("Invalid XML-RPC, check server output")]); }
(String::from(methodName),argv)
}

Expand Down
1 change: 1 addition & 0 deletions structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ pub struct Server {
pub password: String,
pub admins: String,
pub trackspath: String,
pub gametype: String,
}

0 comments on commit f758199

Please sign in to comment.