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
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;
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
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);
}
}
/* 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;
}