passwords in it). The remote_userman configuration directive can be
used to re-enable it.
There is now a new user management window. From here you can add and
remove users or modify their settings.
There is now a new user management window. From here you can add and
remove users or modify their settings.
+Relatedly, the server will only allow remote user management if you set
+remote_userman to 'yes'.
+
* Changes up to version 3.0.2
Builds --without-server should work again.
* Changes up to version 3.0.2
Builds --without-server should work again.
The minimum number of seconds that must elapse between password reminders.
The default is 600, i.e. 10 minutes.
.TP
The minimum number of seconds that must elapse between password reminders.
The default is 600, i.e. 10 minutes.
.TP
+.B remote_userman yes\fR|\fBno
+User management over TCP connection is only allowed if this is set to
+\fByes\fR. By default it is set to \fBno\fR.
+.TP
.B replay_min \fISECONDS\fR
The minimum number of seconds that must elapse after a track has been played
before it can be picked at random. The default is 8 hours. If this is set to
.B replay_min \fISECONDS\fR
The minimum number of seconds that must elapse after a track has been played
before it can be picked at random. The default is 8 hours. If this is set to
{ C(replay_min), &type_integer, validate_non_negative },
{ C(refresh), &type_integer, validate_positive },
{ C(reminder_interval), &type_integer, validate_positive },
{ C(replay_min), &type_integer, validate_non_negative },
{ C(refresh), &type_integer, validate_positive },
{ C(reminder_interval), &type_integer, validate_positive },
+ { C(remote_userman), &type_boolean, validate_any },
{ C2(restrict, restrictions), &type_restrict, validate_any },
{ C(sample_format), &type_sample_format, validate_sample_format },
{ C(scratch), &type_string_accum, validate_isreg },
{ C2(restrict, restrictions), &type_restrict, validate_any },
{ C(sample_format), &type_sample_format, validate_sample_format },
{ C(scratch), &type_string_accum, validate_isreg },
/** @brief Minimum interval between password reminder emails */
long reminder_interval;
/** @brief Minimum interval between password reminder emails */
long reminder_interval;
+
+ /** @brief Whether to allow user management over TCP */
+ int remote_userman;
/* derived values: */
int nparts; /* number of distinct name parts */
/* derived values: */
int nparts; /* number of distinct name parts */
int nvec) {
const char *rights;
int nvec) {
const char *rights;
+ if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
+ 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)) {
if(nvec > 2) {
rights = vec[2];
if(parse_rights(vec[2], 0, 1)) {
int attribute((unused)) nvec) {
struct conn *d;
int attribute((unused)) nvec) {
struct conn *d;
+ if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
+ 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;
if(trackdb_deluser(vec[0])) {
sink_writes(ev_writer_sink(c->w), "550 Cannot delete user\n");
return 1;
int attribute((unused)) nvec) {
struct conn *d;
int attribute((unused)) nvec) {
struct conn *d;
+ if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
+ 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)
/* RIGHT_ADMIN can do anything; otherwise you can only set your own email
* address and password. */
if((c->rights & RIGHT_ADMIN)
struct kvp *k;
const char *value;
struct kvp *k;
const char *value;
+ if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
+ 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 rights list. */
if((c->rights & RIGHT_ADMIN)
/* RIGHT_ADMIN allows anything; otherwise you can only get your own email
* address and rights list. */
if((c->rights & RIGHT_ADMIN)