X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/996f86e664ab6d00a9304a42374e9c691b78ca6b..d6e9200cc35411f3f27426b608bcfdef9348e6d3:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index 7a726c1..4f47c50 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -1,12 +1,13 @@ /* ui-shared.c: common web output functions * - * Copyright (C) 2006 Lars Hjemli + * Copyright (C) 2006-2014 cgit Development Team * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include "cgit.h" +#include "ui-shared.h" #include "cmd.h" #include "html.h" @@ -27,10 +28,21 @@ static char *http_date(time_t t) tm->tm_hour, tm->tm_min, tm->tm_sec); } -void cgit_print_error(const char *msg) +void cgit_print_error(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + cgit_vprint_error(fmt, ap); + va_end(ap); +} + +void cgit_vprint_error(const char *fmt, va_list ap) +{ + va_list cp; html("
"); - html_txt(msg); + va_copy(cp, ap); + html_vtxtf(fmt, cp); + va_end(cp); html("
\n"); } @@ -50,44 +62,43 @@ const char *cgit_hosturl() return NULL; if (!ctx.env.server_port || atoi(ctx.env.server_port) == 80) return ctx.env.server_name; - return xstrdup(fmt("%s:%s", ctx.env.server_name, ctx.env.server_port)); + return fmtalloc("%s:%s", ctx.env.server_name, ctx.env.server_port); } const char *cgit_rooturl() { if (ctx.cfg.virtual_root) - return fmt("%s/", ctx.cfg.virtual_root); + return ctx.cfg.virtual_root; else return ctx.cfg.script_name; } char *cgit_repourl(const char *reponame) { - if (ctx.cfg.virtual_root) { - return fmt("%s/%s/", ctx.cfg.virtual_root, reponame); - } else { - return fmt("?r=%s", reponame); - } + if (ctx.cfg.virtual_root) + return fmtalloc("%s%s/", ctx.cfg.virtual_root, reponame); + else + return fmtalloc("?r=%s", reponame); } char *cgit_fileurl(const char *reponame, const char *pagename, const char *filename, const char *query) { - char *tmp; + struct strbuf sb = STRBUF_INIT; char *delim; if (ctx.cfg.virtual_root) { - tmp = fmt("%s/%s/%s/%s", ctx.cfg.virtual_root, reponame, - pagename, (filename ? filename:"")); + strbuf_addf(&sb, "%s%s/%s/%s", ctx.cfg.virtual_root, reponame, + pagename, (filename ? filename:"")); delim = "?"; } else { - tmp = fmt("?url=%s/%s/%s", reponame, pagename, - (filename ? filename : "")); + strbuf_addf(&sb, "?url=%s/%s/%s", reponame, pagename, + (filename ? filename : "")); delim = "&"; } if (query) - tmp = fmt("%s%s%s", tmp, delim, query); - return tmp; + strbuf_addf(&sb, "%s%s", delim, query); + return strbuf_detach(&sb, NULL); } char *cgit_pageurl(const char *reponame, const char *pagename, @@ -109,7 +120,7 @@ const char *cgit_repobasename(const char *reponame) /* strip trailing slashes */ while (p && rvbuf[p] == '/') rvbuf[p--] = 0; /* strip trailing .git */ - if (p >= 3 && !strncmp(&rvbuf[p-3], ".git", 4)) { + if (p >= 3 && !prefixcmp(&rvbuf[p-3], ".git")) { p -= 3; rvbuf[p--] = 0; } /* strip more trailing slashes if any */ @@ -125,12 +136,10 @@ static void site_url(const char *page, const char *search, const char *sort, int { char *delim = "?"; - if (ctx.cfg.virtual_root) { + if (ctx.cfg.virtual_root) html_attr(ctx.cfg.virtual_root); - if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') - html("/"); - } else - html(ctx.cfg.script_name); + else + html_url_path(ctx.cfg.script_name); if (page) { htmlf("?p=%s", page); @@ -200,8 +209,6 @@ static char *repolink(const char *title, const char *class, const char *page, html(" href='"); if (ctx.cfg.virtual_root) { html_url_path(ctx.cfg.virtual_root); - if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') - html("/"); html_url_path(ctx.repo->url); if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); @@ -212,7 +219,7 @@ static char *repolink(const char *title, const char *class, const char *page, html_url_path(path); } } else { - html(ctx.cfg.script_name); + html_url_path(ctx.cfg.script_name); html("?url="); html_url_arg(ctx.repo->url); if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') @@ -540,21 +547,21 @@ void cgit_submodule_link(const char *class, char *path, const char *rev) htmlf("class='%s' ", class); html("href='"); if (item) { - html_attr(fmt(item->util, rev)); + html_attrf(item->util, rev); } else if (ctx.repo->module_link) { dir = strrchr(path, '/'); if (dir) dir++; else dir = path; - html_attr(fmt(ctx.repo->module_link, dir, rev)); + html_attrf(ctx.repo->module_link, dir, rev); } else { html("#"); } html("'>"); html_txt(path); html(""); - html_txt(fmt(" @ %.7s", rev)); + html_txtf(" @ %.7s", rev); if (item && tail) path[len - 1] = tail; } @@ -634,6 +641,8 @@ void cgit_print_http_headers(struct cgit_context *ctx) if (ctx->page.filename) htmlf("Content-Disposition: inline; filename=\"%s\"\n", ctx->page.filename); + if (!ctx->env.authenticated) + html("Cache-Control: no-cache, no-store\n"); htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); htmlf("Expires: %s\n", http_date(ctx->page.expires)); if (ctx->page.etag) @@ -670,12 +679,16 @@ void cgit_print_docstart(struct cgit_context *ctx) html("'/>\n"); } if (host && ctx->repo && ctx->qry.head) { + struct strbuf sb = STRBUF_INIT; + strbuf_addf(&sb, "h=%s", ctx->qry.head); + html("\n"); + strbuf_release(&sb); } if (ctx->cfg.head_include) html_include(ctx->cfg.head_include); @@ -717,13 +730,14 @@ static int print_branch_option(const char *refname, const unsigned char *sha1, void cgit_add_hidden_formfields(int incl_head, int incl_search, const char *page) { - char *url; - if (!ctx.cfg.virtual_root) { - url = fmt("%s/%s", ctx.qry.repo, page); + struct strbuf url = STRBUF_INIT; + + strbuf_addf(&url, "%s/%s", ctx.qry.repo, page); if (ctx.qry.vpath) - url = fmt("%s/%s", url, ctx.qry.vpath); - html_hidden("url", url); + strbuf_addf(&url, "/%s", ctx.qry.vpath); + html_hidden("url", url.buf); + strbuf_release(&url); } if (incl_head && ctx.qry.head && ctx.repo->defbranch && @@ -802,14 +816,16 @@ static void print_header(struct cgit_context *ctx) cgit_index_link("index", NULL, NULL, NULL, NULL, 0); html(" : "); cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); - html(""); - html("
\n"); - cgit_add_hidden_formfields(0, 1, ctx->qry.page); - html(" "); - html(""); - html("
"); + if (ctx->env.authenticated) { + html(""); + html("
\n"); + cgit_add_hidden_formfields(0, 1, ctx->qry.page); + html(" "); + html(""); + html("
"); + } } else html_txt(ctx->cfg.root_title); html("\n"); @@ -831,11 +847,11 @@ static void print_header(struct cgit_context *ctx) void cgit_print_pageheader(struct cgit_context *ctx) { html("
"); - if (!ctx->cfg.noheader) + if (!ctx->env.authenticated || !ctx->cfg.noheader) print_header(ctx); html("
\n"); - if (ctx->repo) { + if (ctx->env.authenticated && ctx->repo) { cgit_summary_link("summary", NULL, hc(ctx, "summary"), ctx->qry.head); cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, @@ -852,7 +868,7 @@ void cgit_print_pageheader(struct cgit_context *ctx) if (ctx->repo->max_stats) cgit_stats_link("stats", NULL, hc(ctx, "stats"), ctx->qry.head, ctx->qry.vpath); - if (ctx->repo->readme) + if (ctx->repo->readme.nr) reporevlink("about", "about", NULL, hc(ctx, "about"), ctx->qry.head, NULL, NULL); @@ -874,7 +890,7 @@ void cgit_print_pageheader(struct cgit_context *ctx) html("'/>\n"); html("\n"); html("\n"); - } else { + } else if (ctx->env.authenticated) { site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0); if (ctx->cfg.root_readme) site_link("about", "about", NULL, hc(ctx, "about"), @@ -890,7 +906,7 @@ void cgit_print_pageheader(struct cgit_context *ctx) html(""); } html("
\n"); - if (ctx->qry.vpath) { + if (ctx->env.authenticated && ctx->qry.vpath) { html("
"); html("path: "); cgit_print_path_crumbs(ctx, ctx->qry.vpath); @@ -918,20 +934,23 @@ void cgit_print_snapshot_links(const char *repo, const char *head, const char *hex, int snapshots) { const struct cgit_snapshot_format* f; - char *prefix; - char *filename; + struct strbuf filename = STRBUF_INIT; + size_t prefixlen; unsigned char sha1[20]; if (get_sha1(fmt("refs/tags/%s", hex), sha1) == 0 && (hex[0] == 'v' || hex[0] == 'V') && isdigit(hex[1])) hex++; - prefix = xstrdup(fmt("%s-%s", cgit_repobasename(repo), hex)); + strbuf_addf(&filename, "%s-%s", cgit_repobasename(repo), hex); + prefixlen = filename.len; for (f = cgit_snapshot_formats; f->suffix; f++) { if (!(snapshots & f->bit)) continue; - filename = fmt("%s%s", prefix, f->suffix); - cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); + strbuf_setlen(&filename, prefixlen); + strbuf_addstr(&filename, f->suffix); + cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL, + filename.buf); html("
"); } - free(prefix); + strbuf_release(&filename); }