aboutsummaryrefslogtreecommitdiffstats
path: root/ui-shared.c
diff options
context:
space:
mode:
authorGravatar Jason A. Donenfeld <Jason@zx2c4.com>2014-01-15 05:49:31 (JST)
committerGravatar Jason A. Donenfeld <Jason@zx2c4.com>2014-01-16 10:28:12 (JST)
commitd6e9200cc35411f3f27426b608bcfdef9348e6d3 (patch)
tree9cdd921b03465458d10b99ff4357f79a810501c0 /ui-shared.c
parent3741254a6989b2837cd8d20480f152f0096bcb9a (diff)
downloadcgit-d6e9200cc35411f3f27426b608bcfdef9348e6d3.zip
cgit-d6e9200cc35411f3f27426b608bcfdef9348e6d3.tar.gz
auth: add basic authentication filter framework
This leverages the new lua support. See filters/simple-authentication.lua for explaination of how this works. There is also additional documentation in cgitrc.5.txt. Though this is a cookie-based approach, cgit's caching mechanism is preserved for authenticated pages. Very plugable and extendable depending on user needs. The sample script uses an HMAC-SHA1 based cookie to store the currently logged in user, with an expiration date. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui-shared.c')
-rw-r--r--ui-shared.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/ui-shared.c b/ui-shared.c
index abe15cd..4f47c50 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -641,6 +641,8 @@ void cgit_print_http_headers(struct cgit_context *ctx)
641 if (ctx->page.filename) 641 if (ctx->page.filename)
642 htmlf("Content-Disposition: inline; filename=\"%s\"\n", 642 htmlf("Content-Disposition: inline; filename=\"%s\"\n",
643 ctx->page.filename); 643 ctx->page.filename);
644 if (!ctx->env.authenticated)
645 html("Cache-Control: no-cache, no-store\n");
644 htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); 646 htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));
645 htmlf("Expires: %s\n", http_date(ctx->page.expires)); 647 htmlf("Expires: %s\n", http_date(ctx->page.expires));
646 if (ctx->page.etag) 648 if (ctx->page.etag)
@@ -814,14 +816,16 @@ static void print_header(struct cgit_context *ctx)
814 cgit_index_link("index", NULL, NULL, NULL, NULL, 0); 816 cgit_index_link("index", NULL, NULL, NULL, NULL, 0);
815 html(" : "); 817 html(" : ");
816 cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); 818 cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL);
817 html("</td><td class='form'>"); 819 if (ctx->env.authenticated) {
818 html("<form method='get' action=''>\n"); 820 html("</td><td class='form'>");
819 cgit_add_hidden_formfields(0, 1, ctx->qry.page); 821 html("<form method='get' action=''>\n");
820 html("<select name='h' onchange='this.form.submit();'>\n"); 822 cgit_add_hidden_formfields(0, 1, ctx->qry.page);
821 for_each_branch_ref(print_branch_option, ctx->qry.head); 823 html("<select name='h' onchange='this.form.submit();'>\n");
822 html("</select> "); 824 for_each_branch_ref(print_branch_option, ctx->qry.head);
823 html("<input type='submit' name='' value='switch'/>"); 825 html("</select> ");
824 html("</form>"); 826 html("<input type='submit' name='' value='switch'/>");
827 html("</form>");
828 }
825 } else 829 } else
826 html_txt(ctx->cfg.root_title); 830 html_txt(ctx->cfg.root_title);
827 html("</td></tr>\n"); 831 html("</td></tr>\n");
@@ -843,11 +847,11 @@ static void print_header(struct cgit_context *ctx)
843void cgit_print_pageheader(struct cgit_context *ctx) 847void cgit_print_pageheader(struct cgit_context *ctx)
844{ 848{
845 html("<div id='cgit'>"); 849 html("<div id='cgit'>");
846 if (!ctx->cfg.noheader) 850 if (!ctx->env.authenticated || !ctx->cfg.noheader)
847 print_header(ctx); 851 print_header(ctx);
848 852
849 html("<table class='tabs'><tr><td>\n"); 853 html("<table class='tabs'><tr><td>\n");
850 if (ctx->repo) { 854 if (ctx->env.authenticated && ctx->repo) {
851 cgit_summary_link("summary", NULL, hc(ctx, "summary"), 855 cgit_summary_link("summary", NULL, hc(ctx, "summary"),
852 ctx->qry.head); 856 ctx->qry.head);
853 cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, 857 cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head,
@@ -886,7 +890,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
886 html("'/>\n"); 890 html("'/>\n");
887 html("<input type='submit' value='search'/>\n"); 891 html("<input type='submit' value='search'/>\n");
888 html("</form>\n"); 892 html("</form>\n");
889 } else { 893 } else if (ctx->env.authenticated) {
890 site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0); 894 site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0);
891 if (ctx->cfg.root_readme) 895 if (ctx->cfg.root_readme)
892 site_link("about", "about", NULL, hc(ctx, "about"), 896 site_link("about", "about", NULL, hc(ctx, "about"),
@@ -902,7 +906,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
902 html("</form>"); 906 html("</form>");
903 } 907 }
904 html("</td></tr></table>\n"); 908 html("</td></tr></table>\n");
905 if (ctx->qry.vpath) { 909 if (ctx->env.authenticated && ctx->qry.vpath) {
906 html("<div class='path'>"); 910 html("<div class='path'>");
907 html("path: "); 911 html("path: ");
908 cgit_print_path_crumbs(ctx, ctx->qry.vpath); 912 cgit_print_path_crumbs(ctx, ctx->qry.vpath);