From 2cc4c0efc92d0ef1d4b03dcf32419333f843d256 Mon Sep 17 00:00:00 2001 Message-Id: <2cc4c0efc92d0ef1d4b03dcf32419333f843d256.1715529020.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 18 May 2008 16:39:42 +0100 Subject: [PATCH] Return from login page to what you were trying to do Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/cgi.c | 7 ++++++- lib/cgi.h | 1 + server/actions.c | 12 ++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) 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; } -- [mdw]