X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/f902253a124bd45a5011204ea4f9e6226b12d561..c9163d7259e1c056c341a0546bca8546ba8ad98c:/server/dcgi.c?ds=sidebyside diff --git a/server/dcgi.c b/server/dcgi.c index b7a8508..16a5a6c 100644 --- a/server/dcgi.c +++ b/server/dcgi.c @@ -133,6 +133,12 @@ static void header_cookie(struct sink *output) { * cause the browser to expose the cookie to other CGI programs on the same * web server. */ dynstr_append_string(d, ";Version=1;Path="); + /* Formally we are supposed to quote the path, since it invariably has a + * slash in it. However Safari does not parse quoted paths correctly, so + * this won't work. Fortunately nothing else seems to care about proper + * quoting of paths, so in practice we get with it. (See also + * parse_cookie() where we are liberal about cookie paths on the way back + * in.) */ dynstr_append_string(d, u.path); } dynstr_terminate(d); @@ -420,8 +426,18 @@ static void process_prefs(dcgi_state *ds, int numfile) { disorder_unset(ds->g->client, file, "pick_at_random"); else disorder_set(ds->g->client, file, "pick_at_random", "0"); - if((value = numbered_arg("tags", numfile))) - disorder_set(ds->g->client, file, "tags", value); + if((value = numbered_arg("tags", numfile))) { + if(!*value) + disorder_unset(ds->g->client, file, "tags"); + else + disorder_set(ds->g->client, file, "tags", value); + } + if((value = numbered_arg("weight", numfile))) { + if(!*value || !strcmp(value, "90000")) + disorder_unset(ds->g->client, file, "weight"); + else + disorder_set(ds->g->client, file, "weight", value); + } } else if((name = cgi_get("name"))) { /* Raw preferences. Not well supported in the templates at the moment. */ value = cgi_get("value"); @@ -1744,6 +1760,17 @@ static void exp_image(int attribute((unused)) nargs, cgi_output(output, "/disorder/%s", imagestem); } +static void exp_define(int attribute((unused)) nargs, + char **args, + cgi_sink attribute((unused)) *output, + void attribute((unused)) *u) { + const char *n = args[0], *a = args[1], *v = args[2]; + int nas; + char **as = split(a, &nas, 0, 0, 0); + + cgi_define(n, nas, as, v); +} + static const struct cgi_expansion expansions[] = { { "#", 0, INT_MAX, EXP_MAGIC, exp_comment }, { "action", 0, 0, 0, exp_action }, @@ -1751,6 +1778,7 @@ static const struct cgi_expansion expansions[] = { { "arg", 1, 1, 0, exp_arg }, { "basename", 0, 1, 0, exp_basename }, { "choose", 2, 2, EXP_MAGIC, exp_choose }, + { "define", 3, 3, EXP_MAGIC, exp_define }, { "dirname", 0, 1, 0, exp_dirname }, { "enabled", 0, 0, 0, exp_enabled }, { "eq", 2, 2, 0, exp_eq },