diff options
Diffstat (limited to '')
| -rw-r--r-- | cgit.c | 2 | ||||
| -rw-r--r-- | ui-shared.c | 37 | ||||
| -rw-r--r-- | ui-shared.h | 1 | 
3 files changed, 37 insertions, 3 deletions
| @@ -645,7 +645,7 @@ static inline void open_auth_filter(const char *function)  		ctx.env.https ? ctx.env.https : "",  		ctx.qry.repo ? ctx.qry.repo : "",  		ctx.qry.page ? ctx.qry.page : "", -		ctx.qry.url ? ctx.qry.url : "", +		cgit_currentfullurl(),  		cgit_loginurl());  } diff --git a/ui-shared.c b/ui-shared.c index b53c56d..7a4c726 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -68,15 +68,48 @@ char *cgit_hosturl(void)  char *cgit_currenturl(void)  {  	const char *root = cgit_rooturl(); -	size_t len = strlen(root);  	if (!ctx.qry.url)  		return xstrdup(root); -	if (len && root[len - 1] == '/') +	if (root[0] && root[strlen(root) - 1] == '/')  		return fmtalloc("%s%s", root, ctx.qry.url);  	return fmtalloc("%s/%s", root, ctx.qry.url);  } +char *cgit_currentfullurl(void) +{ +	const char *root = cgit_rooturl(); +	const char *orig_query = ctx.env.query_string ? ctx.env.query_string : ""; +	size_t len = strlen(orig_query); +	char *query = xmalloc(len + 2), *start_url, *ret; + +	/* Remove all url=... parts from query string */ +	memcpy(query + 1, orig_query, len + 1); +	query[0] = '?'; +	start_url = query; +	while ((start_url = strstr(start_url, "url=")) != NULL) { +		if (start_url[-1] == '?' || start_url[-1] == '&') { +			const char *end_url = strchr(start_url, '&'); +			if (end_url) +				memmove(start_url, end_url + 1, strlen(end_url)); +			else +				start_url[0] = '\0'; +		} else +			++start_url; +	} +	if (!query[1]) +		query[0] = '\0'; + +	if (!ctx.qry.url) +		ret = fmtalloc("%s%s", root, query); +	else if (root[0] && root[strlen(root) - 1] == '/') +		ret = fmtalloc("%s%s%s", root, ctx.qry.url, query); +	else +		ret = fmtalloc("%s/%s%s", root, ctx.qry.url, query); +	free(query); +	return ret; +} +  const char *cgit_rooturl(void)  {  	if (ctx.cfg.virtual_root) diff --git a/ui-shared.h b/ui-shared.h index 4d5978b..6964873 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -5,6 +5,7 @@ extern const char *cgit_httpscheme(void);  extern char *cgit_hosturl(void);  extern const char *cgit_rooturl(void);  extern char *cgit_currenturl(void); +extern char *cgit_currentfullurl(void);  extern const char *cgit_loginurl(void);  extern char *cgit_repourl(const char *reponame);  extern char *cgit_fileurl(const char *reponame, const char *pagename, | 
