Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
httpd: Validate blob size for blob end readme endpoints
Merged did:key:z6MkkfM3...sVz5 opened 1 year ago

Similar to what we do on the /raw endpoint, we should also make sure that the blob end readme endpoints don’t serve too big files, who can eventually freeze the http consumer.

1 file changed +25 -4 3b342ab3 57273593
modified radicle-httpd/src/api/v1/projects.rs
@@ -537,9 +537,18 @@ async fn blob_handler(
    let (repo, _) = ctx.repo(project)?;
    let repo = Repository::open(repo.path())?;
    let blob = repo.blob(sha, &path)?;
-
    let response = api::json::blob(&blob, &path);

-
    Ok::<_, Error>(immutable_response(response))
+
    if blob.size() > MAX_BODY_LIMIT {
+
        return Ok::<_, Error>(
+
            (
+
                StatusCode::PAYLOAD_TOO_LARGE,
+
                [(header::CACHE_CONTROL, "no-cache")],
+
                Json(json!([])),
+
            )
+
                .into_response(),
+
        );
+
    }
+
    Ok::<_, Error>(immutable_response(api::json::blob(&blob, &path)).into_response())
}

/// Get project readme.
@@ -565,8 +574,20 @@ async fn readme_handler(
        .chain(paths.iter().map(|p| p.to_lowercase()))
    {
        if let Ok(blob) = repo.blob(sha, &path) {
-
            let response = api::json::blob(&blob, &path);
-
            return Ok::<_, Error>(immutable_response(response));
+
            if blob.size() > MAX_BODY_LIMIT {
+
                return Ok::<_, Error>(
+
                    (
+
                        StatusCode::PAYLOAD_TOO_LARGE,
+
                        [(header::CACHE_CONTROL, "no-cache")],
+
                        Json(json!([])),
+
                    )
+
                        .into_response(),
+
                );
+
            }
+

+
            return Ok::<_, Error>(
+
                immutable_response(api::json::blob(&blob, &path)).into_response(),
+
            );
        }
    }