@@ -7,6 +7,7 @@ use dotenv::dotenv;
7
7
use serde_json:: json;
8
8
use simd_json:: to_string as simd_to_string;
9
9
use tokio:: sync:: Mutex ;
10
+ use sha2:: { Digest , Sha256 } ;
10
11
11
12
use super :: builder:: Builder ;
12
13
use super :: bytes:: { DataBundle , DataItem } ;
@@ -213,6 +214,75 @@ async fn maybe_recalc_deephashes(deps: Arc<Deps>, process_id: &String) -> Result
213
214
Ok ( ( ) )
214
215
}
215
216
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
+
216
286
/*
217
287
This writes a message or process data item,
218
288
it detects which it is creating by the tags.
@@ -250,6 +320,8 @@ pub async fn write_item(
250
320
}
251
321
} ;
252
322
323
+ limit_message_size ( & deps, & input, & data_item) ?;
324
+
253
325
deps. logger . log ( format ! (
254
326
"builder initialized item parsed target - {}" ,
255
327
& target_id
0 commit comments