From 4c1632c0b65143c9a67a18529eb45f163f24119c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 4 Sep 2023 17:16:02 -0700 Subject: [PATCH] v1 POC (proof of concept) --- Cargo.lock | 2 ++ Cargo.toml | 2 ++ src/main.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c79c66e..2bc0612 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -360,6 +360,8 @@ name = "strafesnet-scanner" version = "0.1.0" dependencies = [ "rbx_binary", + "rbx_dom_weak", + "rbx_reflection_database", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0117d13..dca4fad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" [dependencies] rbx_binary = "0.7.1" +rbx_dom_weak = "2.5.0" +rbx_reflection_database = "0.2.7" diff --git a/src/main.rs b/src/main.rs index e7a11a9..34c88a5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,64 @@ -fn main() { - println!("Hello, world!"); +fn class_is_a(class: &str, superclass: &str) -> bool { + if class==superclass { + return true + } + let class_descriptor=rbx_reflection_database::get().classes.get(class); + if let Some(descriptor) = &class_descriptor { + if let Some(class_super) = &descriptor.superclass { + return class_is_a(&class_super, superclass) + } + } + return false +} + +fn recursive_collect_scripts(scripts: &mut std::vec::Vec,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance){ + for &referent in instance.children() { + let c = dom.get_by_ref(referent).unwrap(); + if class_is_a(c.class.as_str(), "LuaSourceContainer") { + if let Some(rbx_dom_weak::types::Variant::String(s)) = c.properties.get("Source") { + scripts.push(s.clone()); + } + } + recursive_collect_scripts(scripts,dom,c); + } +} + +fn main() -> Result<(), Box> { + // Using buffered I/O is recommended with rbx_binary + let input = std::io::BufReader::new(std::fs::File::open("map.rbxm")?); + + let dom = rbx_binary::from_reader(input)?; + + //Construct allowed scripts + let mut allowed = std::collections::HashSet::::new(); + for entry in std::fs::read_dir("allowed")? { + allowed.insert(std::fs::read_to_string(entry?.path())?); + } + + let mut scripts = std::vec::Vec::::new(); + recursive_collect_scripts(&mut scripts, &dom, dom.root()); + + //check scribb + let mut any_failed=false; + for (i,script) in scripts.iter().enumerate() { + if allowed.contains(script) { + println!("pass"); + }else{ + println!("fail"); + any_failed=true; + std::fs::write(format!("blocked/{}.lua",i),script)?; + } + } + if any_failed { + println!("One or more scripts are not allowed."); + return Ok(())//everything is not ok but idk how to return an error LMAO + } + println!("All scripts passed!"); + // std::process::Command::new("rbxcompiler") + // .arg("--compile=false") + // .arg("--group=6980477") + // .arg("--asset=5692139100") + // .arg("--input=map.rbxm") + // .spawn()?; + Ok(()) }