From d8c184171df574b46f98d6c7dbbd894d1b9e376b Mon Sep 17 00:00:00 2001 From: DJMrTV Date: Tue, 4 Feb 2025 17:08:04 +0100 Subject: [PATCH] feat(secure): add saving of reports into the report folder --- Cargo.toml | 2 +- src/protocols/secure/method_send_report.rs | 35 ++++++++++++++++++++++ src/protocols/secure/mod.rs | 5 +++- src/rmc/structures/mod.rs | 1 + src/rmc/structures/qbuffer.rs | 12 ++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/protocols/secure/method_send_report.rs create mode 100644 src/rmc/structures/qbuffer.rs diff --git a/Cargo.toml b/Cargo.toml index 9daf326..6af8066 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ rand = "0.9.0-beta.3" rustls = "^0.23.21" hmac = "0.12.1" md-5 = "^0.10.6" -tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread", "net", "sync"] } +tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread", "net", "sync", "fs"] } tokio-stream = { version = "0.1.17", features = ["io-util"] } tonic = "0.12.3" prost = "0.13.4" diff --git a/src/protocols/secure/method_send_report.rs b/src/protocols/secure/method_send_report.rs new file mode 100644 index 0000000..0104855 --- /dev/null +++ b/src/protocols/secure/method_send_report.rs @@ -0,0 +1,35 @@ +use std::io::Cursor; +use log::error; +use crate::endianness::{IS_BIG_ENDIAN, ReadExtensions}; +use crate::protocols::secure::method_register::register; +use crate::prudp::socket::ConnectionData; +use crate::prudp::station_url::StationUrl; +use crate::rmc::message::RMCMessage; +use crate::rmc::response::{ErrorCode, RMCResponseResult}; +use crate::rmc::response::ErrorCode::Core_InvalidArgument; +use crate::rmc::structures::qbuffer; + +pub async fn send_report(rmcmessage: &RMCMessage, report_id: u32, data: Vec) -> RMCResponseResult{ + let result = tokio::fs::write(format!("./reports/{}", report_id), data).await; + + match result{ + Ok(_) => {}, + Err(e) => error!("{}", e) + } + + return rmcmessage.success_with_data(Vec::new()); +} + +pub async fn send_report_raw_params(rmcmessage: &RMCMessage, conn_data: &mut ConnectionData, _: ()) -> RMCResponseResult{ + let mut reader = Cursor::new(&rmcmessage.rest_of_data); + + let Ok(error_id) = reader.read_struct(IS_BIG_ENDIAN) else { + return rmcmessage.error_result_with_code(Core_InvalidArgument); + }; + + let Ok(data) = qbuffer::read(&mut reader) else { + return rmcmessage.error_result_with_code(Core_InvalidArgument); + }; + + send_report(rmcmessage, error_id, data).await +} \ No newline at end of file diff --git a/src/protocols/secure/mod.rs b/src/protocols/secure/mod.rs index b35fc44..b59cce1 100644 --- a/src/protocols/secure/mod.rs +++ b/src/protocols/secure/mod.rs @@ -1,10 +1,13 @@ mod method_register; +mod method_send_report; use crate::define_protocol; use crate::protocols::secure::method_register::register_raw_params; +use crate::protocols::secure::method_send_report::send_report_raw_params; define_protocol!{ 11() => { - 0x01 => register_raw_params + 0x01 => register_raw_params, + 0x08 => send_report_raw_params } } \ No newline at end of file diff --git a/src/rmc/structures/mod.rs b/src/rmc/structures/mod.rs index 1718ef1..cf6ac13 100644 --- a/src/rmc/structures/mod.rs +++ b/src/rmc/structures/mod.rs @@ -22,6 +22,7 @@ pub mod buffer; pub mod connection_data; pub mod rmc_struct; pub mod list; +pub mod qbuffer; pub trait RmcSerialize: Sized{ fn serialize(&self, writer: &mut dyn Write) -> Result<()>; diff --git a/src/rmc/structures/qbuffer.rs b/src/rmc/structures/qbuffer.rs new file mode 100644 index 0000000..09fc8e3 --- /dev/null +++ b/src/rmc/structures/qbuffer.rs @@ -0,0 +1,12 @@ +use std::io::Read; +use crate::endianness::{IS_BIG_ENDIAN, ReadExtensions}; +use crate::rmc::structures::Result; +pub fn read(reader: &mut impl Read) -> Result>{ + let size: u16 = reader.read_struct(IS_BIG_ENDIAN)?; + + let mut vec = vec![0; size as usize]; + + reader.read_exact(&mut vec)?; + + Ok(vec) +} \ No newline at end of file