Skip to content

Commit 15147ce

Browse files
committed
fix: add resource limits on encoded prefs route
1 parent 3d85df5 commit 15147ce

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/settings.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use futures_lite::StreamExt;
1111
use hyper::{Body, Request, Response};
1212
use rinja::Template;
1313
use time::{Duration, OffsetDateTime};
14+
use tokio::time::timeout;
1415
use 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

Comments
 (0)