X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/aec1204a54e3baa12c76db75c2f67696def05eb0..23f7dadaaba2817c92c42c0a642a3186aa8ef24d:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index 06dd0a8..54bbde7 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -54,21 +54,21 @@ const char *cgit_httpscheme(void) return "http://"; } -const char *cgit_hosturl(void) +char *cgit_hosturl(void) { if (ctx.env.http_host) - return ctx.env.http_host; + return xstrdup(ctx.env.http_host); if (!ctx.env.server_name) return NULL; if (!ctx.env.server_port || atoi(ctx.env.server_port) == 80) - return ctx.env.server_name; + return xstrdup(ctx.env.server_name); return fmtalloc("%s:%s", ctx.env.server_name, ctx.env.server_port); } -const char *cgit_currenturl(void) +char *cgit_currenturl(void) { if (!ctx.qry.url) - return cgit_rooturl(); + return xstrdup(cgit_rooturl()); const char *root = cgit_rooturl(); size_t len = strlen(root); if (len && root[len - 1] == '/') @@ -157,8 +157,11 @@ static void site_url(const char *page, const char *search, const char *sort, int if (always_root || page) html_attr(cgit_rooturl()); - else - html_attr(cgit_currenturl()); + else { + char *currenturl = cgit_currenturl(); + html_attr(currenturl); + free(currenturl); + } if (page) { htmlf("?p=%s", page); @@ -522,7 +525,7 @@ void cgit_object_link(struct object *obj) { char *page, *shortrev, *fullrev, *name; - fullrev = sha1_to_hex(obj->sha1); + fullrev = oid_to_hex(&obj->oid); shortrev = xstrdup(fullrev); shortrev[10] = '\0'; if (obj->type == OBJ_COMMIT) { @@ -689,9 +692,11 @@ void cgit_print_http_headers(void) htmlf("Content-Type: %s\n", ctx.page.mimetype); if (ctx.page.size) htmlf("Content-Length: %zd\n", ctx.page.size); - if (ctx.page.filename) - htmlf("Content-Disposition: inline; filename=\"%s\"\n", - ctx.page.filename); + if (ctx.page.filename) { + html("Content-Disposition: inline; filename=\""); + html_header_arg_in_quotes(ctx.page.filename); + html("\"\n"); + } if (!ctx.env.authenticated) html("Cache-Control: no-cache, no-store\n"); htmlf("Last-Modified: %s\n", http_date(ctx.page.modified)); @@ -706,7 +711,9 @@ void cgit_print_http_headers(void) void cgit_redirect(const char *url, bool permanent) { htmlf("Status: %d %s\n", permanent ? 301 : 302, permanent ? "Moved" : "Found"); - htmlf("Location: %s\n\n", url); + html("Location: "); + html_url_path(url); + html("\n\n"); exit(0); } @@ -727,7 +734,7 @@ void cgit_print_docstart(void) return; } - const char *host = cgit_hosturl(); + char *host = cgit_hosturl(); html(cgit_doctype); html("\n"); html("\n"); @@ -746,16 +753,19 @@ void cgit_print_docstart(void) html("'/>\n"); } if (host && ctx.repo && ctx.qry.head) { + char *fileurl; struct strbuf sb = STRBUF_INIT; strbuf_addf(&sb, "h=%s", ctx.qry.head); html("\n"); strbuf_release(&sb); + free(fileurl); } if (ctx.repo) cgit_add_clone_urls(print_rel_vcs_link); @@ -765,6 +775,7 @@ void cgit_print_docstart(void) html("\n"); if (ctx.cfg.header) html_include(ctx.cfg.header); + free(host); } void cgit_print_docend(void) @@ -791,6 +802,7 @@ void cgit_print_docend(void) void cgit_print_error_page(int code, const char *msg, const char *fmt, ...) { va_list ap; + ctx.page.expires = ctx.cfg.cache_dynamic_ttl; ctx.page.status = code; ctx.page.statusmsg = msg; cgit_print_http_headers(); @@ -802,6 +814,18 @@ void cgit_print_error_page(int code, const char *msg, const char *fmt, ...) cgit_print_docend(); } +void cgit_print_layout_start(void) +{ + cgit_print_http_headers(); + cgit_print_docstart(); + cgit_print_pageheader(); +} + +void cgit_print_layout_end(void) +{ + cgit_print_docend(); +} + static void add_clone_urls(void (*fn)(const char *), char *txt, char *suffix) { struct strbuf **url_list = strbuf_split_str(txt, ' ', 0); @@ -869,6 +893,9 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, static const char *hc(const char *page) { + if (!ctx.qry.page) + return NULL; + return strcmp(ctx.qry.page, page) ? NULL : "active"; } @@ -984,9 +1011,12 @@ void cgit_print_pageheader(void) ctx.qry.head, ctx.qry.vpath); html(""); html("
\n"); cgit_add_hidden_formfields(1, 0, "log"); html("\n"); html("
\n"); } else if (ctx.env.authenticated) { + char *currenturl = cgit_currenturl(); site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0, 1); if (ctx.cfg.root_readme) site_link("about", "about", NULL, hc("about"), NULL, NULL, 0, 1); html(""); html("
\n"); html("\n"); html("\n"); html("
"); + free(currenturl); } html("\n"); if (ctx.env.authenticated && ctx.qry.vpath) {