about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJason A. Donenfeld2016-01-14 14:53:28 +0100
committerJason A. Donenfeld2016-01-14 15:42:56 +0100
commitc326f3eb026d67650f79a6dda9a1a42c55d10a25 (patch)
tree51b94c63164ea924eb019c2e3c1e0b290509549b
parentui-blob: set CSP just in case (diff)
downloadcgit-c326f3eb026d67650f79a6dda9a1a42c55d10a25.tar.gz
cgit-c326f3eb026d67650f79a6dda9a1a42c55d10a25.zip
ui-plain: add enable-html-serving flag
Unrestricts plain/ to contents likely to be executed by browser.
-rw-r--r--cgit.c5
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt11
-rw-r--r--shared.c1
-rw-r--r--ui-plain.c10
5 files changed, 29 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c index 3ed1935..7f83a2d 100644 --- a/cgit.c +++ b/cgit.c
@@ -55,6 +55,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va
55 repo->enable_remote_branches = atoi(value); 55 repo->enable_remote_branches = atoi(value);
56 else if (!strcmp(name, "enable-subject-links")) 56 else if (!strcmp(name, "enable-subject-links"))
57 repo->enable_subject_links = atoi(value); 57 repo->enable_subject_links = atoi(value);
58 else if (!strcmp(name, "enable-html-serving"))
59 repo->enable_html_serving = atoi(value);
58 else if (!strcmp(name, "branch-sort")) { 60 else if (!strcmp(name, "branch-sort")) {
59 if (!strcmp(value, "age")) 61 if (!strcmp(value, "age"))
60 repo->branch_sort = 1; 62 repo->branch_sort = 1;
@@ -170,6 +172,8 @@ static void config_cb(const char *name, const char *value)
170 ctx.cfg.enable_remote_branches = atoi(value); 172 ctx.cfg.enable_remote_branches = atoi(value);
171 else if (!strcmp(name, "enable-subject-links")) 173 else if (!strcmp(name, "enable-subject-links"))
172 ctx.cfg.enable_subject_links = atoi(value); 174 ctx.cfg.enable_subject_links = atoi(value);
175 else if (!strcmp(name, "enable-html-serving"))
176 ctx.cfg.enable_html_serving = atoi(value);
173 else if (!strcmp(name, "enable-tree-linenumbers")) 177 else if (!strcmp(name, "enable-tree-linenumbers"))
174 ctx.cfg.enable_tree_linenumbers = atoi(value); 178 ctx.cfg.enable_tree_linenumbers = atoi(value);
175 else if (!strcmp(name, "enable-git-config")) 179 else if (!strcmp(name, "enable-git-config"))
@@ -821,6 +825,7 @@ static void print_repo(FILE *f, struct cgit_repo *repo)
821 fprintf(f, "repo.logo-link=%s\n", repo->logo_link); 825 fprintf(f, "repo.logo-link=%s\n", repo->logo_link);
822 fprintf(f, "repo.enable-remote-branches=%d\n", repo->enable_remote_branches); 826 fprintf(f, "repo.enable-remote-branches=%d\n", repo->enable_remote_branches);
823 fprintf(f, "repo.enable-subject-links=%d\n", repo->enable_subject_links); 827 fprintf(f, "repo.enable-subject-links=%d\n", repo->enable_subject_links);
828 fprintf(f, "repo.enable-html-serving=%d\n", repo->enable_html_serving);
824 if (repo->branch_sort == 1) 829 if (repo->branch_sort == 1)
825 fprintf(f, "repo.branch-sort=age\n"); 830 fprintf(f, "repo.branch-sort=age\n");
826 if (repo->commit_sort) { 831 if (repo->commit_sort) {
diff --git a/cgit.h b/cgit.h index 4b4bcf4..de5c94a 100644 --- a/cgit.h +++ b/cgit.h
@@ -101,6 +101,7 @@ struct cgit_repo {
101 int enable_log_linecount; 101 int enable_log_linecount;
102 int enable_remote_branches; 102 int enable_remote_branches;
103 int enable_subject_links; 103 int enable_subject_links;
104 int enable_html_serving;
104 int max_stats; 105 int max_stats;
105 int branch_sort; 106 int branch_sort;
106 int commit_sort; 107 int commit_sort;
@@ -235,6 +236,7 @@ struct cgit_config {
235 int enable_log_linecount; 236 int enable_log_linecount;
236 int enable_remote_branches; 237 int enable_remote_branches;
237 int enable_subject_links; 238 int enable_subject_links;
239 int enable_html_serving;
238 int enable_tree_linenumbers; 240 int enable_tree_linenumbers;
239 int enable_git_config; 241 int enable_git_config;
240 int local_time; 242 int local_time;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 759f353..47850a8 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt
@@ -190,6 +190,13 @@ enable-subject-links::
190 in commit view. Default value: "0". See also: 190 in commit view. Default value: "0". See also:
191 "repo.enable-subject-links". 191 "repo.enable-subject-links".
192 192
193enable-html-serving::
194 Flag which, when set to "1", will allow the /plain handler to serve
195 mimetype headers that result in the file being treated as HTML by the
196 browser. When set to "0", such file types are returned instead as
197 text/plain or application/octet-stream. Default value: "0". See also:
198 "repo.enable-html-serving".
199
193enable-tree-linenumbers:: 200enable-tree-linenumbers::
194 Flag which, when set to "1", will make cgit generate linenumber links 201 Flag which, when set to "1", will make cgit generate linenumber links
195 for plaintext blobs printed in the tree view. Default value: "1". 202 for plaintext blobs printed in the tree view. Default value: "1".
@@ -513,6 +520,10 @@ repo.enable-subject-links::
513 A flag which can be used to override the global setting 520 A flag which can be used to override the global setting
514 `enable-subject-links'. Default value: none. 521 `enable-subject-links'. Default value: none.
515 522
523enable-html-serving::
524 A flag which can be used to override the global setting
525 `enable-html-serving`. Default value: none.
526
516repo.hide:: 527repo.hide::
517 Flag which, when set to "1", hides the repository from the repository 528 Flag which, when set to "1", hides the repository from the repository
518 index. The repository can still be accessed by providing a direct path. 529 index. The repository can still be accessed by providing a direct path.
diff --git a/shared.c b/shared.c index 42b2ddc..a078a27 100644 --- a/shared.c +++ b/shared.c
@@ -61,6 +61,7 @@ struct cgit_repo *cgit_add_repo(const char *url)
61 ret->enable_log_linecount = ctx.cfg.enable_log_linecount; 61 ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
62 ret->enable_remote_branches = ctx.cfg.enable_remote_branches; 62 ret->enable_remote_branches = ctx.cfg.enable_remote_branches;
63 ret->enable_subject_links = ctx.cfg.enable_subject_links; 63 ret->enable_subject_links = ctx.cfg.enable_subject_links;
64 ret->enable_html_serving = ctx.cfg.enable_html_serving;
64 ret->max_stats = ctx.cfg.max_stats; 65 ret->max_stats = ctx.cfg.max_stats;
65 ret->branch_sort = ctx.cfg.branch_sort; 66 ret->branch_sort = ctx.cfg.branch_sort;
66 ret->commit_sort = ctx.cfg.commit_sort; 67 ret->commit_sort = ctx.cfg.commit_sort;
diff --git a/ui-plain.c b/ui-plain.c index 58addab..ff85113 100644 --- a/ui-plain.c +++ b/ui-plain.c
@@ -37,6 +37,16 @@ static int print_object(const unsigned char *sha1, const char *path)
37 mimetype = get_mimetype_for_filename(path); 37 mimetype = get_mimetype_for_filename(path);
38 ctx.page.mimetype = mimetype; 38 ctx.page.mimetype = mimetype;
39 39
40 if (!ctx.repo->enable_html_serving) {
41 html("X-Content-Type-Options: nosniff\n");
42 html("Content-Security-Policy: default-src 'none'\n");
43 if (mimetype) {
44 /* Built-in white list allows PDF and everything that isn't text/ and application/ */
45 if ((!strncmp(mimetype, "text/", 5) || !strncmp(mimetype, "application/", 12)) && strcmp(mimetype, "application/pdf"))
46 ctx.page.mimetype = NULL;
47 }
48 }
49
40 if (!ctx.page.mimetype) { 50 if (!ctx.page.mimetype) {
41 if (buffer_is_binary(buf, size)) { 51 if (buffer_is_binary(buf, size)) {
42 ctx.page.mimetype = "application/octet-stream"; 52 ctx.page.mimetype = "application/octet-stream";