ui-tree,ui-blame: bail from blame if blob is binary

This avoids piping binary blobs through the source-filter. Also prevent
robots from crawling it, since it's expensive.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
June McEnroe 2019-12-18 21:30:12 +00:00 committed by Jason A. Donenfeld
parent e10159691e
commit cc6d9cc7fc
3 changed files with 9 additions and 2 deletions

View File

@ -1,3 +1,4 @@
User-agent: * User-agent: *
Disallow: /*/snapshot/* Disallow: /*/snapshot/*
Disallow: /*/blame/*
Allow: / Allow: /

View File

@ -152,6 +152,10 @@ static void print_object(const struct object_id *oid, const char *path,
cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path); cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path);
html(")\n"); html(")\n");
if (buffer_is_binary(buf, size)) {
html("<div class='error'>blob is binary.</div>");
goto cleanup;
}
if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
htmlf("<div class='error'>blob size (%ldKB)" htmlf("<div class='error'>blob size (%ldKB)"
" exceeds display size limit (%dKB).</div>", " exceeds display size limit (%dKB).</div>",

View File

@ -89,6 +89,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
enum object_type type; enum object_type type;
char *buf; char *buf;
unsigned long size; unsigned long size;
bool is_binary;
type = oid_object_info(the_repository, oid, &size); type = oid_object_info(the_repository, oid, &size);
if (type == OBJ_BAD) { if (type == OBJ_BAD) {
@ -103,6 +104,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
"Error reading object %s", oid_to_hex(oid)); "Error reading object %s", oid_to_hex(oid));
return; return;
} }
is_binary = buffer_is_binary(buf, size);
cgit_set_title_from_path(path); cgit_set_title_from_path(path);
@ -110,7 +112,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
htmlf("blob: %s (", oid_to_hex(oid)); htmlf("blob: %s (", oid_to_hex(oid));
cgit_plain_link("plain", NULL, NULL, ctx.qry.head, cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
rev, path); rev, path);
if (ctx.repo->enable_blame) { if (ctx.repo->enable_blame && !is_binary) {
html(") ("); html(") (");
cgit_blame_link("blame", NULL, NULL, ctx.qry.head, cgit_blame_link("blame", NULL, NULL, ctx.qry.head,
rev, path); rev, path);
@ -123,7 +125,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
return; return;
} }
if (buffer_is_binary(buf, size)) if (is_binary)
print_binary_buffer(buf, size); print_binary_buffer(buf, size);
else else
print_text_buffer(basename, buf, size); print_text_buffer(basename, buf, size);