@@ -11,6 +11,7 @@ use futures_lite::StreamExt;
1111use hyper:: { Body , Request , Response } ;
1212use rinja:: Template ;
1313use time:: { Duration , OffsetDateTime } ;
14+ use tokio:: time:: timeout;
1415use url:: form_urlencoded;
1516
1617// STRUCTS
@@ -269,16 +270,26 @@ pub async fn encoded_restore(req: Request<Body>) -> Result<Response<Body>, Strin
269270 . await
270271 . map_err ( |e| format ! ( "Failed to get bytes from request body: {}" , e) ) ?;
271272
273+ if body. len ( ) > 1024 * 1024 {
274+ return Err ( "Request body too large" . to_string ( ) ) ;
275+ }
276+
272277 let encoded_prefs = form_urlencoded:: parse ( & body)
273278 . find ( |( key, _) | key == "encoded_prefs" )
274279 . map ( |( _, value) | value)
275280 . ok_or_else ( || "encoded_prefs parameter not found in request body" . to_string ( ) ) ?;
276281
277282 let bytes = base2048:: decode ( & encoded_prefs) . ok_or_else ( || "Failed to decode base2048 encoded preferences" . to_string ( ) ) ?;
278283
279- let out = deflate_decompress ( bytes) ?;
284+ let out = timeout ( std:: time:: Duration :: from_secs ( 1 ) , async { deflate_decompress ( bytes) } )
285+ . await
286+ . map_err ( |e| format ! ( "Failed to decompress bytes: {}" , e) ) ??;
287+
288+ let mut prefs: Preferences = timeout ( std:: time:: Duration :: from_secs ( 1 ) , async { bincode:: deserialize ( & out) } )
289+ . await
290+ . map_err ( |e| format ! ( "Failed to deserialize preferences: {}" , e) ) ?
291+ . map_err ( |e| format ! ( "Failed to deserialize bytes into Preferences struct: {}" , e) ) ?;
280292
281- let mut prefs: Preferences = bincode:: deserialize ( & out) . map_err ( |e| format ! ( "Failed to deserialize bytes into Preferences struct: {}" , e) ) ?;
282293 prefs. available_themes = vec ! [ ] ;
283294
284295 let url = format ! ( "/settings/restore/?{}" , prefs. to_urlencoded( ) ?) ;
0 commit comments