+static void act_confirm(cgi_sink *output,
+ dcgi_state *ds) {
+ const char *confirmation;
+
+ if(!(confirmation = cgi_get("c"))) {
+ cgi_set_option("error", "noconfirm");
+ expand_template(ds, output, "login");
+ }
+ /* Confirm our registration */
+ if(disorder_confirm(ds->g->client, confirmation)) {
+ cgi_set_option("error", "badconfirm");
+ expand_template(ds, output, "login");
+ }
+ /* Get a cookie */
+ if(disorder_make_cookie(ds->g->client, &login_cookie)) {
+ cgi_set_option("error", "cookiefailed");
+ expand_template(ds, output, "login");
+ return;
+ }
+ /* Discard any cached data JIC */
+ ds->g->flags = 0;
+ /* We have a new cookie */
+ header_cookie(output->sink);
+ cgi_set_option("status", "confirmed");
+ expand_template(ds, output, "login");
+}
+
+static void act_edituser(cgi_sink *output,
+ dcgi_state *ds) {
+ const char *email = cgi_get("email"), *password = cgi_get("changepassword1");
+ const char *password2 = cgi_get("changepassword2");
+ int newpassword = 0;
+ disorder_client *c;
+
+ if((password && *password) || (password && *password2)) {
+ if(!password || !password2 || strcmp(password, password2)) {
+ cgi_set_option("error", "passwordmismatch");
+ expand_template(ds, output, "login");
+ return;
+ }
+ } else
+ password = password2 = 0;
+
+ if(email) {
+ if(disorder_edituser(ds->g->client, disorder_user(ds->g->client),
+ "email", email)) {
+ cgi_set_option("error", "badedit");
+ expand_template(ds, output, "login");
+ return;
+ }
+ }
+ if(password) {
+ if(disorder_edituser(ds->g->client, disorder_user(ds->g->client),
+ "password", password)) {
+ cgi_set_option("error", "badedit");
+ expand_template(ds, output, "login");
+ return;
+ }
+ newpassword = 1;
+ }
+ if(newpassword) {
+ login_cookie = 0; /* it'll be invalid now */
+ /* This is a bit duplicative of act_login() */
+ c = disorder_new(0);
+ if(disorder_connect_user(c, disorder_user(ds->g->client), password)) {
+ cgi_set_option("error", "loginfailed");
+ expand_template(ds, output, "login");
+ return;
+ }
+ if(disorder_make_cookie(c, &login_cookie)) {
+ cgi_set_option("error", "cookiefailed");
+ expand_template(ds, output, "login");
+ return;
+ }
+ /* Use the new connection henceforth */
+ ds->g->client = c;
+ ds->g->flags = 0;
+ /* We have a new cookie */
+ header_cookie(output->sink);
+ }
+ cgi_set_option("status", "edited");
+ expand_template(ds, output, "login");
+}
+
+static void act_reminder(cgi_sink *output,
+ dcgi_state *ds) {
+ const char *const username = cgi_get("username");
+
+ if(!username || !*username) {
+ cgi_set_option("error", "nousername");
+ expand_template(ds, output, "login");
+ return;
+ }
+ if(disorder_reminder(ds->g->client, username)) {
+ cgi_set_option("error", "reminderfailed");
+ expand_template(ds, output, "login");
+ return;
+ }
+ cgi_set_option("status", "reminded");
+ expand_template(ds, output, "login");
+}
+