X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/4ae37ed2ea26b8123a0a868b74d6149014e1e2d2..313acc774bff2f76f41ca75cbca43ff3f0ad20cc:/server/server.c diff --git a/server/server.c b/server/server.c index 3ffede6..5d88db4 100644 --- a/server/server.c +++ b/server/server.c @@ -63,6 +63,7 @@ #include "eventlog.h" #include "defs.h" #include "cache.h" +#include "unicode.h" #ifndef NONCE_SIZE # define NONCE_SIZE 16 @@ -579,7 +580,7 @@ static int c_get(struct conn *c, if(vec[1][0] != '_' && (v = trackdb_get(vec[0], vec[1]))) sink_printf(ev_writer_sink(c->w), "252 %s\n", v); else - sink_writes(ev_writer_sink(c->w), "550 not found\n"); + sink_writes(ev_writer_sink(c->w), "555 not found\n"); return 1; } @@ -906,6 +907,10 @@ static int c_tags(struct conn *c, static int c_set_global(struct conn *c, char **vec, int attribute((unused)) nvec) { + if(vec[0][0] == '_') { + sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n"); + return 1; + } trackdb_set_global(vec[0], vec[1], c->who); sink_printf(ev_writer_sink(c->w), "250 OK\n"); return 1; @@ -919,7 +924,7 @@ static int c_get_global(struct conn *c, if(s) sink_printf(ev_writer_sink(c->w), "252 %s\n", s); else - sink_writes(ev_writer_sink(c->w), "550 not found\n"); + sink_writes(ev_writer_sink(c->w), "555 not found\n"); return 1; } @@ -1025,6 +1030,11 @@ static int command(struct conn *c, char *line) { int nvec, n; D(("server command %s", line)); + /* We force everything into NFC as early as possible */ + if(!(line = utf8_compose_canon(line, strlen(line), 0))) { + sink_writes(ev_writer_sink(c->w), "500 cannot normalize command\n"); + return 1; + } if(!(vec = split(line, &nvec, SPLIT_QUOTES, command_error, c))) { sink_writes(ev_writer_sink(c->w), "500 cannot parse command\n"); return 1;