X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/566145652162e02433c1cd461bf9b5e312abbc40..5a7df0480aa9e958e612b2da9addd589d404fd95:/server/server.c diff --git a/server/server.c b/server/server.c index 79ac7b1..3d59398 100644 --- a/server/server.c +++ b/server/server.c @@ -767,7 +767,7 @@ static int c_volume(struct conn *c, sink_writes(ev_writer_sink(c->w), "510 Prohibited\n"); return 1; } - if(mixer_control(&l, &r, set)) + if(mixer_control(-1/*as configured*/, &l, &r, set)) sink_writes(ev_writer_sink(c->w), "550 error accessing mixer\n"); else { sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r); @@ -1096,6 +1096,11 @@ static int c_adduser(struct conn *c, int nvec) { const char *rights; + if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) { + error(0, "S%x: remote adduser", c->tag); + sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n"); + return 1; + } if(nvec > 2) { rights = vec[2]; if(parse_rights(vec[2], 0, 1)) { @@ -1117,6 +1122,11 @@ static int c_deluser(struct conn *c, int attribute((unused)) nvec) { struct conn *d; + if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) { + error(0, "S%x: remote deluser", c->tag); + sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n"); + return 1; + } if(trackdb_deluser(vec[0])) { sink_writes(ev_writer_sink(c->w), "550 Cannot delete user\n"); return 1; @@ -1134,6 +1144,11 @@ static int c_edituser(struct conn *c, int attribute((unused)) nvec) { struct conn *d; + if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) { + error(0, "S%x: remote edituser", c->tag); + sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n"); + return 1; + } /* RIGHT_ADMIN can do anything; otherwise you can only set your own email * address and password. */ if((c->rights & RIGHT_ADMIN) @@ -1172,8 +1187,17 @@ static int c_userinfo(struct conn *c, struct kvp *k; const char *value; + /* We allow remote querying of rights so that clients can figure out what + * they're allowed to do */ + if(!config->remote_userman + && !(c->rights & RIGHT__LOCAL) + && strcmp(vec[1], "rights")) { + error(0, "S%x: remote userinfo %s %s", c->tag, vec[0], vec[1]); + sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n"); + return 1; + } /* RIGHT_ADMIN allows anything; otherwise you can only get your own email - * address and righst list. */ + * address and rights list. */ if((c->rights & RIGHT_ADMIN) || (!strcmp(c->who, vec[0]) && (!strcmp(vec[1], "email")