From: Richard Kettlewell Date: Sun, 18 May 2008 15:39:42 +0000 (+0100) Subject: Return from login page to what you were trying to do X-Git-Tag: 4.0~76^2~9 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/2cc4c0efc92d0ef1d4b03dcf32419333f843d256 Return from login page to what you were trying to do --- diff --git a/lib/cgi.c b/lib/cgi.c index 1d1ddd7..c3a7680 100644 --- a/lib/cgi.c +++ b/lib/cgi.c @@ -213,6 +213,11 @@ void cgi_set(const char *name, const char *value) { hash_add(cgi_args, name, &value, HASH_INSERT_OR_REPLACE); } +/** @brief Clear CGI arguments */ +void cgi_clear(void) { + cgi_args = hash_new(sizeof (char *)); +} + /** @brief Add SGML-style quoting * @param src String to quote (UTF-8) * @return Quoted string @@ -354,7 +359,7 @@ char *cgi_thisurl(const char *url) { dynstr_append(d, n ? '&' : '?'); dynstr_append_string(d, urlencodestring(keys[n])); dynstr_append(d, '='); - dynstr_append_string(d, cgi_get(keys[n])); + dynstr_append_string(d, urlencodestring(cgi_get(keys[n]))); } dynstr_terminate(d); return d->vec; diff --git a/lib/cgi.h b/lib/cgi.h index ec60482..f8f5bf2 100644 --- a/lib/cgi.h +++ b/lib/cgi.h @@ -35,6 +35,7 @@ void cgi_opentag(struct sink *output, const char *name, ...); void cgi_closetag(struct sink *output, const char *name); char *cgi_makeurl(const char *url, ...); char *cgi_thisurl(const char *url); +void cgi_clear(void); #endif diff --git a/server/actions.c b/server/actions.c index c53575e..90c5a1f 100644 --- a/server/actions.c +++ b/server/actions.c @@ -289,7 +289,11 @@ static void act_login(void) { if(!login_as(username, password)) { /* Report the succesful login */ dcgi_status_string = "loginok"; - dcgi_expand("login", 1); + /* Redirect back to where we came from, if necessary */ + if(cgi_get("back")) + redirect(0); + else + dcgi_expand("login", 1); } } @@ -651,8 +655,12 @@ void dcgi_action(const char *action) { /* Some right or other is required */ dcgi_lookup(DCGI_RIGHTS); if(!(actions[n].rights & dcgi_rights)) { + const char *back = cgi_thisurl(config->url); /* Failed operations jump you to the login screen with an error - * message */ + * message. On success, the user comes back to the page they were + * after. */ + cgi_clear(); + cgi_set("back", back); login_error("noright"); return; }