/*
* This file is part of DisOrder.
- * Copyright (C) 2004-2009 Richard Kettlewell
+ * Copyright (C) 2004-2012 Richard Kettlewell
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
struct listener {
const char *name;
int pf;
+ int privileged;
};
struct conn;
/* check whether the response is right */
res = authhash(c->nonce, sizeof c->nonce, password,
config->authorization_algorithm);
- if(wideopen || (res && !strcmp(res, vec[1]))) {
+ if(wideopen || c->l->privileged || (res && !strcmp(res, vec[1]))) {
c->who = vec[0];
c->rights = rights;
/* currently we only bother logging remote connections */
if((l = trackdb_get(playing->track, "_length"))
&& (length = atol(l))) {
xtime(&when);
- when += length - playing->sofar + config->gap;
+ when += length - playing->sofar;
}
} else
/* Nothing is playing but playing is enabled, so whatever is
if(when) {
if((l = trackdb_get(q->track, "_length"))
&& (length = atol(l)))
- when += length + config->gap;
+ when += length;
else
when = 0;
}
revoke_cookie(c->cookie);
sink_writes(ev_writer_sink(c->w), "250 OK\n");
} else
- sink_writes(ev_writer_sink(c->w), "550 Did not log in with cookie\n");
+ sink_writes(ev_writer_sink(c->w), "510 Did not log in with cookie\n");
return 1;
}
if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
disorder_error(0, "S%x: remote adduser", c->tag);
- sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+ sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
return 1;
}
if(nvec > 2) {
if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
disorder_error(0, "S%x: remote deluser", c->tag);
- sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+ sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
return 1;
}
if(trackdb_deluser(vec[0])) {
if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
disorder_error(0, "S%x: remote edituser", c->tag);
- sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+ sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
return 1;
}
/* RIGHT_ADMIN can do anything; otherwise you can only set your own email
&& !(c->rights & RIGHT__LOCAL)
&& strcmp(vec[1], "rights")) {
disorder_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");
+ sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
return 1;
}
/* RIGHT_ADMIN allows anything; otherwise you can only get your own email
}
user = xstrndup(vec[0], sep - vec[0]);
if(trackdb_confirm(user, vec[0], &rights))
- sink_writes(ev_writer_sink(c->w), "550 Incorrect confirmation string\n");
+ sink_writes(ev_writer_sink(c->w), "510 Incorrect confirmation string\n");
else {
c->who = user;
c->cookie = 0;
const char *who = kvp_get(actiondata, "who");
if(!who || !c->who || strcmp(who, c->who)) {
- sink_writes(ev_writer_sink(c->w), "551 Not authorized\n");
+ sink_writes(ev_writer_sink(c->w), "510 Not authorized\n");
return 1; /* completed */
}
}
case 0:
assert(!"cannot cope with success");
case EACCES:
- sink_writes(ev_writer_sink(c->w), "550 Access denied\n");
+ sink_writes(ev_writer_sink(c->w), "510 Access denied\n");
break;
case EINVAL:
sink_writes(ev_writer_sink(c->w), "550 Invalid playlist name\n");
int server_start(ev_source *ev, int pf,
size_t socklen, const struct sockaddr *sa,
- const char *name) {
+ const char *name,
+ int privileged) {
int fd;
struct listener *l = xmalloc(sizeof *l);
static const int one = 1;
- D(("server_init socket %s", name));
+ D(("server_init socket %s privileged=%d", name, privileged));
+ /* Sanity check */
+ if(privileged && pf != AF_UNIX)
+ disorder_fatal(0, "cannot create a privileged listener on a non-local port");
fd = xsocket(pf, SOCK_STREAM, 0);
xsetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
if(bind(fd, sa, socklen) < 0) {
cloexec(fd);
l->name = name;
l->pf = pf;
+ l->privileged = privileged;
if(ev_listen(ev, fd, listen_callback, l, "server listener"))
exit(EXIT_FAILURE);
disorder_info("listening on %s", name);