auth: have cgit calculate login address

This way we're sure to use virtual root, or any other strangeness
encountered.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2014-01-16 23:21:54 +01:00
parent df00ab1096
commit a431326e8f
6 changed files with 16 additions and 10 deletions

3
cgit.c
View File

@ -611,7 +611,8 @@ static inline void open_auth_filter(struct cgit_context *ctx, const char *functi
ctx->env.https ? ctx->env.https : "", ctx->env.https ? ctx->env.https : "",
ctx->qry.repo ? ctx->qry.repo : "", ctx->qry.repo ? ctx->qry.repo : "",
ctx->qry.page ? ctx->qry.page : "", ctx->qry.page ? ctx->qry.page : "",
ctx->qry.url ? ctx->qry.url : ""); ctx->qry.url ? ctx->qry.url : "",
cgit_loginurl());
} }
/* We intentionally keep this rather small, instead of looping and /* We intentionally keep this rather small, instead of looping and

View File

@ -645,7 +645,7 @@ source filter::
filtered contents is expected on standard output. filtered contents is expected on standard output.
auth filter:: auth filter::
The authentication filter receives 11 parameters: The authentication filter receives 12 parameters:
- filter action, explained below, which specifies which action the - filter action, explained below, which specifies which action the
filter is called for filter is called for
- http cookie - http cookie
@ -656,8 +656,9 @@ auth filter::
- cgit repo - cgit repo
- cgit page - cgit page
- cgit url - cgit url
- cgit login url
When the filter action is "body", this filter must write to output the When the filter action is "body", this filter must write to output the
HTML for displaying the login form, which POSTs to "/?p=login". When HTML for displaying the login form, which POSTs to the login url. When
the filter action is "authenticate-cookie", this filter must validate the filter action is "authenticate-cookie", this filter must validate
the http cookie and return a 0 if it is invalid or 1 if it is invalid, the http cookie and return a 0 if it is invalid or 1 if it is invalid,
in the exit code / close function. If the filter action is in the exit code / close function. If the filter action is

View File

@ -417,7 +417,7 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
switch (filtertype) { switch (filtertype) {
case AUTH: case AUTH:
argument_count = 11; argument_count = 12;
break; break;
case EMAIL: case EMAIL:

View File

@ -122,12 +122,7 @@ function filter_open(...)
cgit["repo"] = select(9, ...) cgit["repo"] = select(9, ...)
cgit["page"] = select(10, ...) cgit["page"] = select(10, ...)
cgit["url"] = select(11, ...) cgit["url"] = select(11, ...)
cgit["login"] = select(12, ...)
cgit["login"] = ""
for _ in cgit["url"]:gfind("/") do
cgit["login"] = cgit["login"] .. "../"
end
cgit["login"] = cgit["login"] .. "?p=login"
end end

View File

@ -73,6 +73,14 @@ const char *cgit_rooturl()
return ctx.cfg.script_name; return ctx.cfg.script_name;
} }
const char *cgit_loginurl()
{
static const char *login_url = 0;
if (!login_url)
login_url = fmtalloc("%s?p=login", cgit_rooturl());
return login_url;
}
char *cgit_repourl(const char *reponame) char *cgit_repourl(const char *reponame)
{ {
if (ctx.cfg.virtual_root) if (ctx.cfg.virtual_root)

View File

@ -4,6 +4,7 @@
extern const char *cgit_httpscheme(); extern const char *cgit_httpscheme();
extern const char *cgit_hosturl(); extern const char *cgit_hosturl();
extern const char *cgit_rooturl(); extern const char *cgit_rooturl();
extern const char *cgit_loginurl();
extern char *cgit_repourl(const char *reponame); extern char *cgit_repourl(const char *reponame);
extern char *cgit_fileurl(const char *reponame, const char *pagename, extern char *cgit_fileurl(const char *reponame, const char *pagename,
const char *filename, const char *query); const char *filename, const char *query);