@@ -11,6 +11,7 @@ use futures_lite::StreamExt;
11
11
use hyper:: { Body , Request , Response } ;
12
12
use rinja:: Template ;
13
13
use time:: { Duration , OffsetDateTime } ;
14
+ use tokio:: time:: timeout;
14
15
use url:: form_urlencoded;
15
16
16
17
// STRUCTS
@@ -269,16 +270,26 @@ pub async fn encoded_restore(req: Request<Body>) -> Result<Response<Body>, Strin
269
270
. await
270
271
. map_err ( |e| format ! ( "Failed to get bytes from request body: {}" , e) ) ?;
271
272
273
+ if body. len ( ) > 1024 * 1024 {
274
+ return Err ( "Request body too large" . to_string ( ) ) ;
275
+ }
276
+
272
277
let encoded_prefs = form_urlencoded:: parse ( & body)
273
278
. find ( |( key, _) | key == "encoded_prefs" )
274
279
. map ( |( _, value) | value)
275
280
. ok_or_else ( || "encoded_prefs parameter not found in request body" . to_string ( ) ) ?;
276
281
277
282
let bytes = base2048:: decode ( & encoded_prefs) . ok_or_else ( || "Failed to decode base2048 encoded preferences" . to_string ( ) ) ?;
278
283
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) ) ?;
280
292
281
- let mut prefs: Preferences = bincode:: deserialize ( & out) . map_err ( |e| format ! ( "Failed to deserialize bytes into Preferences struct: {}" , e) ) ?;
282
293
prefs. available_themes = vec ! [ ] ;
283
294
284
295
let url = format ! ( "/settings/restore/?{}" , prefs. to_urlencoded( ) ?) ;
0 commit comments