diff --git a/Cargo.lock b/Cargo.lock index 380ffd3..c26c440 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -148,9 +148,9 @@ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "blake3" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" +checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" dependencies = [ "arrayref", "arrayvec", @@ -191,9 +191,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" dependencies = [ "shlex", ] @@ -320,9 +320,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -388,9 +388,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -410,9 +410,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -702,9 +702,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -712,6 +712,7 @@ dependencies = [ "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -721,9 +722,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.62" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2fd658b06e56721792c5df4475705b6cda790e9298d19d2f8af083457bcd127" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -884,9 +885,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown", @@ -951,9 +952,9 @@ checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -1030,9 +1031,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -1121,9 +1122,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.9.0", "cfg-if", @@ -1153,9 +1154,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -1328,10 +1329,11 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.3" +version = "0.4.4-pre2" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "077e2a0b201a777dfd2ff822766ae7d0c8c3003206115da57f7bce15ee73cbc7" +checksum = "a32b98d3f303002faae783b5c1087e35c36a260b56470fd14a0606f35169ab35" dependencies = [ + "bytes", "chrono", "flate2", "reqwest", @@ -1544,9 +1546,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags 2.9.0", "errno", @@ -1557,9 +1559,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "once_cell", "ring", @@ -1797,15 +1799,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1972,9 +1974,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -2302,11 +2304,37 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2322,7 +2350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -2344,6 +2372,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2513,9 +2550,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yoke" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 5f65441..52cd553 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" submissions-api = { path = "api", features = ["internal"], default-features = false, registry = "strafesnet" } async-nats = "0.40.0" futures = "0.3.31" -rbx_asset = { version = "0.4.3", registry = "strafesnet" } +rbx_asset = { version = "0.4.4-pre2", registry = "strafesnet" } rbx_binary = { version = "0.7.4", registry = "strafesnet"} rbx_dom_weak = { version = "2.9.0", registry = "strafesnet"} rbx_reflection_database = { version = "0.2.12", registry = "strafesnet"} diff --git a/validation/src/check.rs b/validation/src/check.rs index 5ee908b..0aee2b2 100644 --- a/validation/src/check.rs +++ b/validation/src/check.rs @@ -8,8 +8,6 @@ use heck::{ToSnakeCase,ToTitleCase}; pub enum Error{ ModelInfoDownload(rbx_asset::cloud::GetError), CreatorTypeMustBeUser, - ParseUserID(core::num::ParseIntError), - ParseModelVersion(core::num::ParseIntError), Download(crate::download::Error), ModelFileDecode(ReadDomError), } @@ -316,20 +314,20 @@ impl crate::message_handler::MessageHandler{ ).await.map_err(Error::ModelInfoDownload)?; // reject models created by a group - let rbx_asset::cloud::Creator::userId(_user_id_string)=info.creationContext.creator else{ + let rbx_asset::cloud::Creator::userId(_user_id)=info.creationContext.creator else{ return Err(Error::CreatorTypeMustBeUser); }; // parse model version string - let version=info.revisionId.parse().map_err(Error::ParseModelVersion)?; + let version=info.revisionId; - let model_data=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ + let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ asset_id:check_info.ModelID, version, }).await.map_err(Error::Download)?; // decode dom (slow!) - let dom=read_dom(std::io::Cursor::new(model_data)).map_err(Error::ModelFileDecode)?; + let dom=maybe_gzip.read_with(read_dom,read_dom).map_err(Error::ModelFileDecode)?; let report=check(&dom); diff --git a/validation/src/create.rs b/validation/src/create.rs index 9db62a8..c6ea948 100644 --- a/validation/src/create.rs +++ b/validation/src/create.rs @@ -6,8 +6,6 @@ use crate::rbx_util::{get_root_instance,get_mapinfo,read_dom,MapInfo,ReadDomErro pub enum Error{ CreatorTypeMustBeUser, ModelInfoDownload(rbx_asset::cloud::GetError), - ParseUserID(core::num::ParseIntError), - ParseModelVersion(core::num::ParseIntError), Download(crate::download::Error), ModelFileDecode(ReadDomError), GetRootInstance(GetRootInstanceError), @@ -40,22 +38,20 @@ impl crate::message_handler::MessageHandler{ ).await.map_err(Error::ModelInfoDownload)?; // reject models created by a group - let rbx_asset::cloud::Creator::userId(user_id_string)=info.creationContext.creator else{ + let rbx_asset::cloud::Creator::userId(user_id)=info.creationContext.creator else{ return Err(Error::CreatorTypeMustBeUser); }; - // parse user string and model version string - let user_id:u64=user_id_string.parse().map_err(Error::ParseUserID)?; - let asset_version=info.revisionId.parse().map_err(Error::ParseModelVersion)?; + let asset_version=info.revisionId; // download the map model - let model_data=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ + let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ asset_id:create_info.ModelID, version:asset_version, }).await.map_err(Error::Download)?; // decode dom (slow!) - let dom=read_dom(std::io::Cursor::new(model_data)).map_err(Error::ModelFileDecode)?; + let dom=maybe_gzip.read_with(read_dom,read_dom).map_err(Error::ModelFileDecode)?; // extract the root instance let model_instance=get_root_instance(&dom).map_err(Error::GetRootInstance)?; diff --git a/validation/src/download.rs b/validation/src/download.rs index 202be72..63f16ae 100644 --- a/validation/src/download.rs +++ b/validation/src/download.rs @@ -12,7 +12,7 @@ impl std::fmt::Display for Error{ } impl std::error::Error for Error{} -pub async fn download_asset_version(cloud_context:&rbx_asset::cloud::Context,request:rbx_asset::cloud::GetAssetVersionRequest)->Result<Vec<u8>,Error>{ +pub async fn download_asset_version(cloud_context:&rbx_asset::cloud::Context,request:rbx_asset::cloud::GetAssetVersionRequest)->Result<rbx_asset::types::MaybeGzippedBytes,Error>{ // download the location of the map model let location=cloud_context.get_asset_version_location(request).await.map_err(Error::ModelLocationDownload)?; @@ -20,7 +20,7 @@ pub async fn download_asset_version(cloud_context:&rbx_asset::cloud::Context,req let location=location.location.ok_or(Error::NonFreeModel)?; // download the map model - let model_data=cloud_context.get_asset(&location).await.map_err(Error::ModelFileDownload)?; + let maybe_gzip=cloud_context.get_asset(&location).await.map_err(Error::ModelFileDownload)?; - Ok(model_data) + Ok(maybe_gzip) } diff --git a/validation/src/rbx_util.rs b/validation/src/rbx_util.rs index 4d49cd0..92f8fa4 100644 --- a/validation/src/rbx_util.rs +++ b/validation/src/rbx_util.rs @@ -5,8 +5,7 @@ pub enum ReadDomError{ Binary(rbx_binary::DecodeError), Xml(rbx_xml::DecodeError), Read(std::io::Error), - Seek(std::io::Error), - UnknownFormat([u8;8]), + UnknownFormat(Vec<u8>), } impl std::fmt::Display for ReadDomError{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -15,19 +14,13 @@ impl std::fmt::Display for ReadDomError{ } impl std::error::Error for ReadDomError{} -pub fn read_dom<R:std::io::Read+std::io::Seek>(mut input:R)->Result<rbx_dom_weak::WeakDom,ReadDomError>{ - let mut first_8=[0u8;8]; - std::io::Read::read_exact(&mut input,&mut first_8).map_err(ReadDomError::Read)?; - std::io::Seek::rewind(&mut input).map_err(ReadDomError::Seek)?; - match &first_8[0..4]{ - b"<rob"=>{ - match &first_8[4..8]{ - b"lox!"=>rbx_binary::from_reader(input).map_err(ReadDomError::Binary), - b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(ReadDomError::Xml), - _=>Err(ReadDomError::UnknownFormat(first_8)), - } - }, - _=>Err(ReadDomError::UnknownFormat(first_8)), +pub fn read_dom<R:std::io::Read>(input:R)->Result<rbx_dom_weak::WeakDom,ReadDomError>{ + let mut buf=std::io::BufReader::new(input); + let peek=std::io::BufRead::fill_buf(&mut buf).map_err(ReadDomError::Read)?; + match peek.get(0..8){ + Some(b"<roblox!")=>rbx_binary::from_reader(buf).map_err(ReadDomError::Binary), + Some(b"<roblox ")=>rbx_xml::from_reader_default(buf).map_err(ReadDomError::Xml), + _=>Err(ReadDomError::UnknownFormat(peek.to_owned())), } } diff --git a/validation/src/upload_mapfix.rs b/validation/src/upload_mapfix.rs index b74e562..3e3e8d8 100644 --- a/validation/src/upload_mapfix.rs +++ b/validation/src/upload_mapfix.rs @@ -5,6 +5,7 @@ use crate::nats_types::UploadMapfixRequest; #[derive(Debug)] pub enum Error{ Download(crate::download::Error), + IO(std::io::Error), Json(serde_json::Error), Upload(rbx_asset::cookie::UploadError), ApiActionMapfixUploaded(submissions_api::Error), @@ -19,11 +20,14 @@ impl std::error::Error for Error{} impl crate::message_handler::MessageHandler{ pub async fn upload_mapfix(&self,upload_info:UploadMapfixRequest)->Result<(),Error>{ // download the map model - let model_data=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ + let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ asset_id:upload_info.ModelID, version:upload_info.ModelVersion, }).await.map_err(Error::Download)?; + // transparently handle gzipped models + let model_data=maybe_gzip.to_vec().map_err(Error::IO)?; + // upload the map to the strafesnet group let _upload_response=self.cookie_context.upload(rbx_asset::cookie::UploadRequest{ assetid:upload_info.TargetAssetID, diff --git a/validation/src/upload_submission.rs b/validation/src/upload_submission.rs index 9052433..bc07b75 100644 --- a/validation/src/upload_submission.rs +++ b/validation/src/upload_submission.rs @@ -5,6 +5,7 @@ use crate::nats_types::UploadSubmissionRequest; #[derive(Debug)] pub enum Error{ Download(crate::download::Error), + IO(std::io::Error), Json(serde_json::Error), Create(rbx_asset::cookie::CreateError), SystemTime(std::time::SystemTimeError), @@ -20,11 +21,14 @@ impl std::error::Error for Error{} impl crate::message_handler::MessageHandler{ pub async fn upload_submission(&self,upload_info:UploadSubmissionRequest)->Result<(),Error>{ // download the map model - let model_data=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ + let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ asset_id:upload_info.ModelID, version:upload_info.ModelVersion, }).await.map_err(Error::Download)?; + // transparently handle gzipped models + let model_data=maybe_gzip.to_vec().map_err(Error::IO)?; + // upload the map to the strafesnet group let upload_response=self.cookie_context.create(rbx_asset::cookie::CreateRequest{ name:upload_info.ModelName.clone(), diff --git a/validation/src/validator.rs b/validation/src/validator.rs index 1215ee4..28cda8b 100644 --- a/validation/src/validator.rs +++ b/validation/src/validator.rs @@ -91,13 +91,13 @@ impl From<crate::nats_types::ValidateSubmissionRequest> for ValidateRequest{ impl crate::message_handler::MessageHandler{ pub async fn validate_inner(&self,validate_info:ValidateRequest)->Result<(),Error>{ // download the map model - let model_data=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ + let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{ asset_id:validate_info.ModelID, version:validate_info.ModelVersion, }).await.map_err(Error::Download)?; // decode dom (slow!) - let mut dom=read_dom(std::io::Cursor::new(model_data)).map_err(Error::ModelFileDecode)?; + let mut dom=maybe_gzip.read_with(read_dom,read_dom).map_err(Error::ModelFileDecode)?; /* VALIDATE MAP */