Skip to content

Commit a024d7e

Browse files
committed
feat(su): limits with whitelist
1 parent d959e78 commit a024d7e

File tree

4 files changed

+129
-1
lines changed

4 files changed

+129
-1
lines changed

servers/su/src/domain/config.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ pub struct AoConfig {
5454
pub assignment: String,
5555

5656
pub cache_url: String,
57+
58+
pub enable_message_max_size: bool,
59+
pub max_message_size: usize,
60+
pub max_size_owner_whitelist: Vec<String>,
61+
pub max_size_from_owner_whitelist: Vec<String>,
62+
pub max_size_from_whitelist: Vec<String>,
5763
}
5864

5965
fn get_db_dirs() -> (String, String, String, String) {
@@ -218,6 +224,31 @@ impl AoConfig {
218224
Err(_e) => "https://cache.forward.computer".to_string(),
219225
};
220226

227+
let enable_message_max_size = match env::var("ENABLE_MESSAGE_MAX_SIZE") {
228+
Ok(val) => val == "true",
229+
Err(_e) => false,
230+
};
231+
232+
let max_message_size = match env::var("MAX_MESSAGE_SIZE_BYTES") {
233+
Ok(val) => val.parse().unwrap(),
234+
Err(_e) => 102400,
235+
};
236+
237+
let max_size_owner_whitelist: Vec<String> = match env::var("MAX_SIZE_OWNER_WHITELIST") {
238+
Ok(val) => val.split(',').map(|s| s.trim().to_string()).collect(),
239+
Err(_e) => vec![],
240+
};
241+
242+
let max_size_from_whitelist: Vec<String> = match env::var("MAX_SIZE_FROM_WHITELIST") {
243+
Ok(val) => val.split(',').map(|s| s.trim().to_string()).collect(),
244+
Err(_e) => vec![],
245+
};
246+
247+
let max_size_from_owner_whitelist: Vec<String> = match env::var("MAX_SIZE_FROM_OWNER_WHITELIST") {
248+
Ok(val) => val.split(',').map(|s| s.trim().to_string()).collect(),
249+
Err(_e) => vec![],
250+
};
251+
221252
Ok(AoConfig {
222253
database_url: env::var("DATABASE_URL")?,
223254
database_read_url,
@@ -249,7 +280,12 @@ impl AoConfig {
249280
enable_router_check,
250281
router_url,
251282
assignment,
252-
cache_url
283+
cache_url,
284+
enable_message_max_size,
285+
max_message_size,
286+
max_size_owner_whitelist,
287+
max_size_from_owner_whitelist,
288+
max_size_from_whitelist
253289
})
254290
}
255291
}
@@ -291,4 +327,19 @@ impl Config for AoConfig {
291327
fn assignment(&self) -> String {
292328
self.assignment.clone()
293329
}
330+
fn enable_message_max_size(&self) -> bool {
331+
self.enable_message_max_size.clone()
332+
}
333+
fn max_message_size(&self) -> usize {
334+
self.max_message_size.clone()
335+
}
336+
fn max_size_owner_whitelist(&self) -> Vec<String> {
337+
self.max_size_owner_whitelist.clone()
338+
}
339+
fn max_size_from_owner_whitelist(&self) -> Vec<String> {
340+
self.max_size_from_owner_whitelist.clone()
341+
}
342+
fn max_size_from_whitelist(&self) -> Vec<String> {
343+
self.max_size_from_whitelist.clone()
344+
}
294345
}

servers/su/src/domain/core/dal.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ pub trait Config: Send + Sync {
7777
fn enable_router_check(&self) -> bool;
7878
fn router_url(&self) -> String;
7979
fn assignment(&self) -> String;
80+
fn enable_message_max_size(&self) -> bool;
81+
fn max_message_size(&self) -> usize;
82+
fn max_size_owner_whitelist(&self) -> Vec<String>;
83+
fn max_size_from_owner_whitelist(&self) -> Vec<String>;
84+
fn max_size_from_whitelist(&self) -> Vec<String>;
8085
}
8186

8287
#[derive(Debug)]

servers/su/src/domain/core/flows.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use dotenv::dotenv;
77
use serde_json::json;
88
use simd_json::to_string as simd_to_string;
99
use tokio::sync::Mutex;
10+
use sha2::{Digest, Sha256};
1011

1112
use super::builder::Builder;
1213
use super::bytes::{DataBundle, DataItem};
@@ -213,6 +214,75 @@ async fn maybe_recalc_deephashes(deps: Arc<Deps>, process_id: &String) -> Result
213214
Ok(())
214215
}
215216

217+
fn limit_message_size(
218+
deps: &Arc<Deps>,
219+
input: &Vec<u8>,
220+
data_item: &Option<DataItem>
221+
) -> Result<(), String> {
222+
let enable_message_max_size = deps.config.enable_message_max_size();
223+
let max_size_owner_whitelist = deps.config.max_size_owner_whitelist();
224+
let max_size_from_owner_whitelist = deps.config.max_size_from_owner_whitelist();
225+
let max_size_from_whitelist = deps.config.max_size_from_whitelist();
226+
let max_message_size = deps.config.max_message_size();
227+
228+
if !enable_message_max_size {
229+
return Ok(());
230+
}
231+
232+
if let Some(item) = data_item {
233+
let tags = item.tags();
234+
let from_process = tags.iter().find(
235+
|tag| tag.name == "From-Process" || tag.name == "from-process"
236+
);
237+
238+
let owner = item.owner().to_string();
239+
let owner_bytes = match base64_url::decode(&owner) {
240+
Ok(b) => b,
241+
Err(_) => return Err("Unable to decode owner".to_string()),
242+
};
243+
let mut hasher = Sha256::new();
244+
hasher.update(owner_bytes);
245+
let result = hasher.finalize();
246+
let address_hash = result.to_vec();
247+
let address = base64_url::encode(&address_hash);
248+
249+
println!("Owner: {}", address);
250+
println!("From-process: {:?}", from_process);
251+
252+
match tags
253+
.iter()
254+
.find(|tag| tag.name == "Type" || tag.name == "type")
255+
{
256+
Some(type_tag) => match type_tag.value.as_str() {
257+
"Process" => return Ok(()),
258+
"Message" => (),
259+
_ => return Err("Unsupported Type tag value".to_string()),
260+
},
261+
None => return Err("Type tag not present".to_string()),
262+
}
263+
264+
if max_size_owner_whitelist.contains(&address) {
265+
return Ok(());
266+
}
267+
268+
if let Some(fp) = from_process {
269+
if max_size_from_owner_whitelist.contains(&address)
270+
&& max_size_from_whitelist.contains(&fp.value) {
271+
return Ok(());
272+
}
273+
}
274+
}
275+
276+
if input.len() > max_message_size {
277+
return Err(format!(
278+
"Message size exceeds maximum of {} bytes",
279+
max_message_size
280+
));
281+
}
282+
283+
Ok(())
284+
}
285+
216286
/*
217287
This writes a message or process data item,
218288
it detects which it is creating by the tags.
@@ -250,6 +320,8 @@ pub async fn write_item(
250320
}
251321
};
252322

323+
limit_message_size(&deps, &input, &data_item)?;
324+
253325
deps.logger.log(format!(
254326
"builder initialized item parsed target - {}",
255327
&target_id

servers/su/su

35 KB
Binary file not shown.

0 commit comments

Comments
 (0)