chiark / gitweb /
Clean up online registration confirmation strings. Now they are
[disorder] / server / server.c
1 /*
2  * This file is part of DisOrder.
3  * Copyright (C) 2004-2009 Richard Kettlewell
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "disorder-server.h"
20 #include "basen.h"
21
22 #ifndef NONCE_SIZE
23 # define NONCE_SIZE 16
24 #endif
25
26 #ifndef CONFIRM_SIZE
27 /** @brief Size of nonce in confirmation string in 32-bit words
28  *
29  * 64 bits gives 11 digits (in base 62).
30  */
31 # define CONFIRM_SIZE 2
32 #endif
33
34 int volume_left, volume_right;          /* last known volume */
35
36 /** @brief Accept all well-formed login attempts
37  *
38  * Used in debugging.
39  */
40 int wideopen;
41
42 struct listener {
43   const char *name;
44   int pf;
45 };
46
47 /** @brief One client connection */
48 struct conn {
49   /** @brief Read commands from here */
50   ev_reader *r;
51   /** @brief Send responses to here */
52   ev_writer *w;
53   /** @brief Underlying file descriptor */
54   int fd;
55   /** @brief Unique identifier for connection used in log messages */
56   unsigned tag;
57   /** @brief Login name or NULL */
58   char *who;
59   /** @brief Event loop */
60   ev_source *ev;
61   /** @brief Nonce chosen for this connection */
62   unsigned char nonce[NONCE_SIZE];
63   /** @brief Current reader callback
64    *
65    * We change this depending on whether we're servicing the @b log command
66    */
67   ev_reader_callback *reader;
68   /** @brief Event log output sending to this connection */
69   struct eventlog_output *lo;
70   /** @brief Parent listener */
71   const struct listener *l;
72   /** @brief Login cookie or NULL */
73   char *cookie;
74   /** @brief Connection rights */
75   rights_type rights;
76   /** @brief Next connection */
77   struct conn *next;
78   /** @brief True if pending rescan had 'wait' set */
79   int rescan_wait;
80 };
81
82 /** @brief Linked list of connections */
83 static struct conn *connections;
84
85 static int reader_callback(ev_source *ev,
86                            ev_reader *reader,
87                            void *ptr,
88                            size_t bytes,
89                            int eof,
90                            void *u);
91
92 static const char *noyes[] = { "no", "yes" };
93
94 /** @brief Remove a connection from the connection list */
95 static void remove_connection(struct conn *c) {
96   struct conn **cc;
97
98   for(cc = &connections; *cc && *cc != c; cc = &(*cc)->next)
99     ;
100   if(*cc)
101     *cc = c->next;
102 }
103
104 /** @brief Called when a connection's writer fails or is shut down
105  *
106  * If the connection still has a raeder that is cancelled.
107  */
108 static int writer_error(ev_source attribute((unused)) *ev,
109                         int errno_value,
110                         void *u) {
111   struct conn *c = u;
112
113   D(("server writer_error S%x %d", c->tag, errno_value));
114   if(errno_value == 0) {
115     /* writer is done */
116     D(("S%x writer completed", c->tag));
117   } else {
118     if(errno_value != EPIPE)
119       error(errno_value, "S%x write error on socket", c->tag);
120     if(c->r) {
121       D(("cancel reader"));
122       ev_reader_cancel(c->r);
123       c->r = 0;
124     }
125     D(("done cancel reader"));
126   }
127   c->w = 0;
128   ev_report(ev);
129   remove_connection(c);
130   return 0;
131 }
132
133 /** @brief Called when a conncetion's reader fails or is shut down
134  *
135  * If connection still has a writer then it is closed.
136  */
137 static int reader_error(ev_source attribute((unused)) *ev,
138                         int errno_value,
139                         void *u) {
140   struct conn *c = u;
141
142   D(("server reader_error S%x %d", c->tag, errno_value));
143   error(errno_value, "S%x read error on socket", c->tag);
144   if(c->w)
145     ev_writer_close(c->w);
146   c->w = 0;
147   c->r = 0;
148   ev_report(ev);
149   remove_connection(c);
150   return 0;
151 }
152
153 static int c_disable(struct conn *c, char **vec, int nvec) {
154   if(nvec == 0)
155     disable_playing(c->who);
156   else if(nvec == 1 && !strcmp(vec[0], "now"))
157     disable_playing(c->who);
158   else {
159     sink_writes(ev_writer_sink(c->w), "550 invalid argument\n");
160     return 1;                   /* completed */
161   }
162   sink_writes(ev_writer_sink(c->w), "250 OK\n");
163   return 1;                     /* completed */
164 }
165
166 static int c_enable(struct conn *c,
167                     char attribute((unused)) **vec,
168                     int attribute((unused)) nvec) {
169   enable_playing(c->who, c->ev);
170   /* Enable implicitly unpauses if there is nothing playing */
171   if(paused && !playing) resume_playing(c->who);
172   sink_writes(ev_writer_sink(c->w), "250 OK\n");
173   return 1;                     /* completed */
174 }
175
176 static int c_enabled(struct conn *c,
177                      char attribute((unused)) **vec,
178                      int attribute((unused)) nvec) {
179   sink_printf(ev_writer_sink(c->w), "252 %s\n", noyes[playing_is_enabled()]);
180   return 1;                     /* completed */
181 }
182
183 static int c_play(struct conn *c, char **vec,
184                   int attribute((unused)) nvec) {
185   const char *track;
186   struct queue_entry *q;
187   
188   if(!trackdb_exists(vec[0])) {
189     sink_writes(ev_writer_sink(c->w), "550 track is not in database\n");
190     return 1;
191   }
192   if(!(track = trackdb_resolve(vec[0]))) {
193     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
194     return 1;
195   }
196   q = queue_add(track, c->who, WHERE_BEFORE_RANDOM, origin_picked);
197   queue_write();
198   /* If we added the first track, and something is playing, then prepare the
199    * new track.  If nothing is playing then we don't bother as it wouldn't gain
200    * anything. */
201   if(q == qhead.next && playing)
202     prepare(c->ev, q);
203   sink_printf(ev_writer_sink(c->w), "252 %s\n", q->id);
204   /* If the queue was empty but we are for some reason paused then
205    * unpause. */
206   if(!playing) resume_playing(0);
207   play(c->ev);
208   return 1;                     /* completed */
209 }
210
211 static int c_remove(struct conn *c, char **vec,
212                     int attribute((unused)) nvec) {
213   struct queue_entry *q;
214
215   if(!(q = queue_find(vec[0]))) {
216     sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n");
217     return 1;
218   }
219   if(!right_removable(c->rights, c->who, q)) {
220     error(0, "%s attempted remove but lacks required rights", c->who);
221     sink_writes(ev_writer_sink(c->w),
222                 "510 Not authorized to remove that track\n");
223     return 1;
224   }
225   queue_remove(q, c->who);
226   /* De-prepare the track. */
227   abandon(c->ev, q);
228   /* See about adding a new random track */
229   add_random_track(c->ev);
230   /* Prepare whatever the next head track is. */
231   if(qhead.next != &qhead)
232     prepare(c->ev, qhead.next);
233   queue_write();
234   sink_writes(ev_writer_sink(c->w), "250 removed\n");
235   return 1;                     /* completed */
236 }
237
238 static int c_scratch(struct conn *c,
239                      char **vec,
240                      int nvec) {
241   if(!playing) {
242     sink_writes(ev_writer_sink(c->w), "250 nothing is playing\n");
243     return 1;                   /* completed */
244   }
245   /* TODO there is a bug here: if we specify an ID but it's not the currently
246    * playing track then you will get 550 if you weren't authorized to scratch
247    * the currently playing track. */
248   if(!right_scratchable(c->rights, c->who, playing)) {
249     error(0, "%s attempted scratch but lacks required rights", c->who);
250     sink_writes(ev_writer_sink(c->w),
251                 "510 Not authorized to scratch that track\n");
252     return 1;
253   }
254   scratch(c->who, nvec == 1 ? vec[0] : 0);
255   /* If you scratch an unpaused track then it is automatically unpaused */
256   resume_playing(0);
257   sink_writes(ev_writer_sink(c->w), "250 scratched\n");
258   return 1;                     /* completed */
259 }
260
261 static int c_pause(struct conn *c,
262                    char attribute((unused)) **vec,
263                    int attribute((unused)) nvec) {
264   if(!playing) {
265     sink_writes(ev_writer_sink(c->w), "250 nothing is playing\n");
266     return 1;                   /* completed */
267   }
268   if(paused) {
269     sink_writes(ev_writer_sink(c->w), "250 already paused\n");
270     return 1;                   /* completed */
271   }
272   if(pause_playing(c->who) < 0)
273     sink_writes(ev_writer_sink(c->w), "550 cannot pause this track\n");
274   else
275     sink_writes(ev_writer_sink(c->w), "250 paused\n");
276   return 1;
277 }
278
279 static int c_resume(struct conn *c,
280                    char attribute((unused)) **vec,
281                    int attribute((unused)) nvec) {
282   if(!paused) {
283     sink_writes(ev_writer_sink(c->w), "250 not paused\n");
284     return 1;                   /* completed */
285   }
286   resume_playing(c->who);
287   sink_writes(ev_writer_sink(c->w), "250 paused\n");
288   return 1;
289 }
290
291 static int c_shutdown(struct conn *c,
292                       char attribute((unused)) **vec,
293                       int attribute((unused)) nvec) {
294   info("S%x shut down by %s", c->tag, c->who);
295   sink_writes(ev_writer_sink(c->w), "250 shutting down\n");
296   ev_writer_flush(c->w);
297   quit(c->ev);
298 }
299
300 static int c_reconfigure(struct conn *c,
301                          char attribute((unused)) **vec,
302                          int attribute((unused)) nvec) {
303   info("S%x reconfigure by %s", c->tag, c->who);
304   if(reconfigure(c->ev, 1))
305     sink_writes(ev_writer_sink(c->w), "550 error reading new config\n");
306   else
307     sink_writes(ev_writer_sink(c->w), "250 installed new config\n");
308   return 1;                             /* completed */
309 }
310
311 static void finished_rescan(void *ru) {
312   struct conn *const c = ru;
313
314   sink_writes(ev_writer_sink(c->w), "250 rescan completed\n");
315   /* Turn this connection back on */
316   ev_reader_enable(c->r);
317 }
318
319 static void start_fresh_rescan(void *ru) {
320   struct conn *const c = ru;
321
322   if(trackdb_rescan_underway()) {
323     /* Some other waiter beat us to it.  However in this case we're happy to
324      * piggyback; the requirement is that a new rescan be started, not that it
325      * was _our_ rescan. */
326     if(c->rescan_wait) {
327       /* We block until the rescan completes */
328       trackdb_add_rescanned(finished_rescan, c);
329     } else {
330       /* We report that the new rescan has started */
331       sink_writes(ev_writer_sink(c->w), "250 rescan initiated\n");
332       /* Turn this connection back on */
333       ev_reader_enable(c->r);
334     }
335   } else {
336     /* We are the first connection to get a callback so we must start a
337      * rescan. */
338     if(c->rescan_wait) {
339       /* We want to block until the new rescan completes */
340       trackdb_rescan(c->ev, 1/*check*/, finished_rescan, c);
341     } else {
342       /* We can report back immediately */
343       trackdb_rescan(c->ev, 1/*check*/, 0, 0);
344       sink_writes(ev_writer_sink(c->w), "250 rescan initiated\n");
345       /* Turn this connection back on */
346       ev_reader_enable(c->r);
347     }
348   }
349 }
350
351 static int c_rescan(struct conn *c,
352                     char **vec,
353                     int nvec) {
354   int flag_wait = 0, flag_fresh = 0, n;
355
356   /* Parse flags */
357   for(n = 0; n < nvec; ++n) {
358     if(!strcmp(vec[n], "wait"))
359       flag_wait = 1;                    /* wait for rescan to complete */
360 #if 0
361     /* Currently disabled because untested (and hard to test). */
362     else if(!strcmp(vec[n], "fresh"))
363       flag_fresh = 1;                   /* don't piggyback underway rescan */
364 #endif
365     else {
366       sink_writes(ev_writer_sink(c->w), "550 unknown flag\n");
367       return 1;                         /* completed */
368     }
369   }
370   /* Report what was requested */
371   info("S%x rescan by %s (%s %s)", c->tag, c->who,
372        flag_wait ? "wait" : "",
373        flag_fresh ? "fresh" : "");
374   if(trackdb_rescan_underway()) {
375     if(flag_fresh) {
376       /* We want a fresh rescan but there is already one underway.  Arrange a
377        * callback when it completes and then set off a new one. */
378       c->rescan_wait = flag_wait;
379       trackdb_add_rescanned(start_fresh_rescan, c);
380       if(flag_wait)
381         return 0;
382       else {
383         sink_writes(ev_writer_sink(c->w), "250 rescan queued\n");
384         return 1;
385       }
386     } else {
387       /* There's a rescan underway, and it's acceptable to piggyback on it */
388       if(flag_wait) {
389         /* We want to block until completion. */
390         trackdb_add_rescanned(finished_rescan, c);
391         return 0;
392       } else {
393         /* We don't want to block.  So we just report that things are in
394          * hand. */
395         sink_writes(ev_writer_sink(c->w), "250 rescan already underway\n");
396         return 1;
397       }
398     }
399   } else {
400     /* No rescan is underway.  fresh is therefore irrelevant. */
401     if(flag_wait) {
402       /* We want to block until completion */
403       trackdb_rescan(c->ev, 1/*check*/, finished_rescan, c);
404       return 0;
405     } else {
406       /* We don't want to block. */
407       trackdb_rescan(c->ev, 1/*check*/, 0, 0);
408       sink_writes(ev_writer_sink(c->w), "250 rescan initiated\n");
409       return 1;                         /* completed */
410     }
411   }
412 }
413
414 static int c_version(struct conn *c,
415                      char attribute((unused)) **vec,
416                      int attribute((unused)) nvec) {
417   /* VERSION had better only use the basic character set */
418   sink_printf(ev_writer_sink(c->w), "251 %s\n", disorder_short_version_string);
419   return 1;                     /* completed */
420 }
421
422 static int c_playing(struct conn *c,
423                      char attribute((unused)) **vec,
424                      int attribute((unused)) nvec) {
425   if(playing) {
426     queue_fix_sofar(playing);
427     playing->expected = 0;
428     sink_printf(ev_writer_sink(c->w), "252 %s\n", queue_marshall(playing));
429   } else
430     sink_printf(ev_writer_sink(c->w), "259 nothing playing\n");
431   return 1;                             /* completed */
432 }
433
434 static const char *connection_host(struct conn *c) {
435   union {
436     struct sockaddr sa;
437     struct sockaddr_in in;
438     struct sockaddr_in6 in6;
439   } u;
440   socklen_t l;
441   int n;
442   char host[1024];
443
444   /* get connection data */
445   l = sizeof u;
446   if(getpeername(c->fd, &u.sa, &l) < 0) {
447     error(errno, "S%x error calling getpeername", c->tag);
448     return 0;
449   }
450   if(c->l->pf != PF_UNIX) {
451     if((n = getnameinfo(&u.sa, l,
452                         host, sizeof host, 0, 0, NI_NUMERICHOST))) {
453       error(0, "S%x error calling getnameinfo: %s", c->tag, gai_strerror(n));
454       return 0;
455     }
456     return xstrdup(host);
457   } else
458     return "local";
459 }
460
461 static int c_user(struct conn *c,
462                   char **vec,
463                   int attribute((unused)) nvec) {
464   struct kvp *k;
465   const char *res, *host, *password;
466   rights_type rights;
467
468   if(c->who) {
469     sink_writes(ev_writer_sink(c->w), "530 already authenticated\n");
470     return 1;
471   }
472   /* get connection data */
473   if(!(host = connection_host(c))) {
474     sink_writes(ev_writer_sink(c->w), "530 authentication failure\n");
475     return 1;
476   }
477   /* find the user */
478   k = trackdb_getuserinfo(vec[0]);
479   /* reject nonexistent users */
480   if(!k) {
481     error(0, "S%x unknown user '%s' from %s", c->tag, vec[0], host);
482     sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
483     return 1;
484   }
485   /* reject unconfirmed users */
486   if(kvp_get(k, "confirmation")) {
487     error(0, "S%x unconfirmed user '%s' from %s", c->tag, vec[0], host);
488     sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
489     return 1;
490   }
491   password = kvp_get(k, "password");
492   if(!password) password = "";
493   if(parse_rights(kvp_get(k, "rights"), &rights, 1)) {
494     error(0, "error parsing rights for %s", vec[0]);
495     sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
496     return 1;
497   }
498   /* check whether the response is right */
499   res = authhash(c->nonce, sizeof c->nonce, password,
500                  config->authorization_algorithm);
501   if(wideopen || (res && !strcmp(res, vec[1]))) {
502     c->who = vec[0];
503     c->rights = rights;
504     /* currently we only bother logging remote connections */
505     if(strcmp(host, "local"))
506       info("S%x %s connected from %s", c->tag, vec[0], host);
507     else
508       c->rights |= RIGHT__LOCAL;
509     sink_writes(ev_writer_sink(c->w), "230 OK\n");
510     return 1;
511   }
512   /* oops, response was wrong */
513   info("S%x authentication failure for %s from %s", c->tag, vec[0], host);
514   sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
515   return 1;
516 }
517
518 static int c_recent(struct conn *c,
519                     char attribute((unused)) **vec,
520                     int attribute((unused)) nvec) {
521   const struct queue_entry *q;
522
523   sink_writes(ev_writer_sink(c->w), "253 Tracks follow\n");
524   for(q = phead.next; q != &phead; q = q->next)
525     sink_printf(ev_writer_sink(c->w), " %s\n", queue_marshall(q));
526   sink_writes(ev_writer_sink(c->w), ".\n");
527   return 1;                             /* completed */
528 }
529
530 static int c_queue(struct conn *c,
531                    char attribute((unused)) **vec,
532                    int attribute((unused)) nvec) {
533   struct queue_entry *q;
534   time_t when = 0;
535   const char *l;
536   long length;
537
538   sink_writes(ev_writer_sink(c->w), "253 Tracks follow\n");
539   if(playing_is_enabled() && !paused) {
540     if(playing) {
541       queue_fix_sofar(playing);
542       if((l = trackdb_get(playing->track, "_length"))
543          && (length = atol(l))) {
544         time(&when);
545         when += length - playing->sofar + config->gap;
546       }
547     } else
548       /* Nothing is playing but playing is enabled, so whatever is
549        * first in the queue can be expected to start immediately. */
550       time(&when);
551   }
552   for(q = qhead.next; q != &qhead; q = q->next) {
553     /* fill in estimated start time */
554     q->expected = when;
555     sink_printf(ev_writer_sink(c->w), " %s\n", queue_marshall(q));
556     /* update for next track */
557     if(when) {
558       if((l = trackdb_get(q->track, "_length"))
559          && (length = atol(l)))
560         when += length + config->gap;
561       else
562         when = 0;
563     }
564   }
565   sink_writes(ev_writer_sink(c->w), ".\n");
566   return 1;                             /* completed */
567 }
568
569 static int output_list(struct conn *c, char **vec) {
570   while(*vec)
571     sink_printf(ev_writer_sink(c->w), "%s\n", *vec++);
572   sink_writes(ev_writer_sink(c->w), ".\n");
573   return 1;
574 }
575
576 static int files_dirs(struct conn *c,
577                       char **vec,
578                       int nvec,
579                       enum trackdb_listable what) {
580   const char *dir, *re, *errstr;
581   int erroffset;
582   pcre *rec;
583   char **fvec, *key;
584   
585   switch(nvec) {
586   case 0: dir = 0; re = 0; break;
587   case 1: dir = vec[0]; re = 0; break;
588   case 2: dir = vec[0]; re = vec[1]; break;
589   default: abort();
590   }
591   /* A bit of a bodge to make sure the args don't trample on cache keys */
592   if(dir && strchr(dir, '\n')) {
593     sink_writes(ev_writer_sink(c->w), "550 invalid directory name\n");
594     return 1;
595   }
596   if(re && strchr(re, '\n')) {
597     sink_writes(ev_writer_sink(c->w), "550 invalid regexp\n");
598     return 1;
599   }
600   /* We bother eliminating "" because the web interface is relatively
601    * likely to send it */
602   if(re && *re) {
603     byte_xasprintf(&key, "%d\n%s\n%s", (int)what, dir ? dir : "", re);
604     fvec = (char **)cache_get(&cache_files_type, key);
605     if(fvec) {
606       /* Got a cache hit, don't store the answer in the cache */
607       key = 0;
608       ++cache_files_hits;
609       rec = 0;                          /* quieten compiler */
610     } else {
611       /* Cache miss, we'll do the lookup and key != 0 so we'll store the answer
612        * in the cache. */
613       if(!(rec = pcre_compile(re, PCRE_CASELESS|PCRE_UTF8,
614                               &errstr, &erroffset, 0))) {
615         sink_printf(ev_writer_sink(c->w), "550 Error compiling regexp: %s\n",
616                     errstr);
617         return 1;
618       }
619       /* It only counts as a miss if the regexp was valid. */
620       ++cache_files_misses;
621     }
622   } else {
623     /* No regexp, don't bother caching the result */
624     rec = 0;
625     key = 0;
626     fvec = 0;
627   }
628   if(!fvec) {
629     /* No cache hit (either because a miss, or because we did not look) so do
630      * the lookup */
631     if(dir && *dir)
632       fvec = trackdb_list(dir, 0, what, rec);
633     else
634       fvec = trackdb_list(0, 0, what, rec);
635   }
636   if(key)
637     /* Put the answer in the cache */
638     cache_put(&cache_files_type, key, fvec);
639   sink_writes(ev_writer_sink(c->w), "253 Listing follow\n");
640   return output_list(c, fvec);
641 }
642
643 static int c_files(struct conn *c,
644                   char **vec,
645                   int nvec) {
646   return files_dirs(c, vec, nvec, trackdb_files);
647 }
648
649 static int c_dirs(struct conn *c,
650                   char **vec,
651                   int nvec) {
652   return files_dirs(c, vec, nvec, trackdb_directories);
653 }
654
655 static int c_allfiles(struct conn *c,
656                       char **vec,
657                       int nvec) {
658   return files_dirs(c, vec, nvec, trackdb_directories|trackdb_files);
659 }
660
661 static int c_get(struct conn *c,
662                  char **vec,
663                  int attribute((unused)) nvec) {
664   const char *v, *track;
665
666   if(!(track = trackdb_resolve(vec[0]))) {
667     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
668     return 1;
669   }
670   if(vec[1][0] != '_' && (v = trackdb_get(track, vec[1])))
671     sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(v));
672   else
673     sink_writes(ev_writer_sink(c->w), "555 not found\n");
674   return 1;
675 }
676
677 static int c_length(struct conn *c,
678                  char **vec,
679                  int attribute((unused)) nvec) {
680   const char *track, *v;
681
682   if(!(track = trackdb_resolve(vec[0]))) {
683     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
684     return 1;
685   }
686   if((v = trackdb_get(track, "_length")))
687     sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(v));
688   else
689     sink_writes(ev_writer_sink(c->w), "550 not found\n");
690   return 1;
691 }
692
693 static int c_set(struct conn *c,
694                  char **vec,
695                  int attribute((unused)) nvec) {
696   const char *track;
697
698   if(!(track = trackdb_resolve(vec[0]))) {
699     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
700     return 1;
701   }
702   if(vec[1][0] != '_' && !trackdb_set(track, vec[1], vec[2]))
703     sink_writes(ev_writer_sink(c->w), "250 OK\n");
704   else
705     sink_writes(ev_writer_sink(c->w), "550 not found\n");
706   return 1;
707 }
708
709 static int c_prefs(struct conn *c,
710                    char **vec,
711                    int attribute((unused)) nvec) {
712   struct kvp *k;
713   const char *track;
714
715   if(!(track = trackdb_resolve(vec[0]))) {
716     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
717     return 1;
718   }
719   k = trackdb_get_all(track);
720   sink_writes(ev_writer_sink(c->w), "253 prefs follow\n");
721   for(; k; k = k->next)
722     if(k->name[0] != '_')               /* omit internal values */
723       sink_printf(ev_writer_sink(c->w),
724                   " %s %s\n", quoteutf8(k->name), quoteutf8(k->value));
725   sink_writes(ev_writer_sink(c->w), ".\n");
726   return 1;
727 }
728
729 static int c_exists(struct conn *c,
730                     char **vec,
731                     int attribute((unused)) nvec) {
732   /* trackdb_exists() does its own alias checking */
733   sink_printf(ev_writer_sink(c->w), "252 %s\n", noyes[trackdb_exists(vec[0])]);
734   return 1;
735 }
736
737 static void search_parse_error(const char *msg, void *u) {
738   *(const char **)u = msg;
739 }
740
741 static int c_search(struct conn *c,
742                           char **vec,
743                           int attribute((unused)) nvec) {
744   char **terms, **results;
745   int nterms, nresults, n;
746   const char *e = "unknown error";
747
748   /* This is a bit of a bodge.  Initially it's there to make the eclient
749    * interface a bit more convenient to add searching to, but it has the more
750    * compelling advantage that if everything uses it, then interpretation of
751    * user-supplied search strings will be the same everywhere. */
752   if(!(terms = split(vec[0], &nterms, SPLIT_QUOTES, search_parse_error, &e))) {
753     sink_printf(ev_writer_sink(c->w), "550 %s\n", e);
754   } else {
755     results = trackdb_search(terms, nterms, &nresults);
756     sink_printf(ev_writer_sink(c->w), "253 %d matches\n", nresults);
757     for(n = 0; n < nresults; ++n)
758       sink_printf(ev_writer_sink(c->w), "%s\n", results[n]);
759     sink_writes(ev_writer_sink(c->w), ".\n");
760   }
761   return 1;
762 }
763
764 static int c_random_enable(struct conn *c,
765                            char attribute((unused)) **vec,
766                            int attribute((unused)) nvec) {
767   enable_random(c->who, c->ev);
768   /* Enable implicitly unpauses if there is nothing playing */
769   if(paused && !playing) resume_playing(c->who);
770   sink_writes(ev_writer_sink(c->w), "250 OK\n");
771   return 1;                     /* completed */
772 }
773
774 static int c_random_disable(struct conn *c,
775                             char attribute((unused)) **vec,
776                             int attribute((unused)) nvec) {
777   disable_random(c->who);
778   sink_writes(ev_writer_sink(c->w), "250 OK\n");
779   return 1;                     /* completed */
780 }
781
782 static int c_random_enabled(struct conn *c,
783                             char attribute((unused)) **vec,
784                             int attribute((unused)) nvec) {
785   sink_printf(ev_writer_sink(c->w), "252 %s\n", noyes[random_is_enabled()]);
786   return 1;                     /* completed */
787 }
788
789 static void got_stats(char *stats, void *u) {
790   struct conn *const c = u;
791
792   sink_printf(ev_writer_sink(c->w), "253 stats\n%s\n.\n", stats);
793   /* Now we can start processing commands again */
794   ev_reader_enable(c->r);
795 }
796
797 static int c_stats(struct conn *c,
798                    char attribute((unused)) **vec,
799                    int attribute((unused)) nvec) {
800   trackdb_stats_subprocess(c->ev, got_stats, c);
801   return 0;                             /* not yet complete */
802 }
803
804 static int c_volume(struct conn *c,
805                     char **vec,
806                     int nvec) {
807   int l, r, set;
808   char lb[32], rb[32];
809   rights_type rights;
810
811   switch(nvec) {
812   case 0:
813     set = 0;
814     break;
815   case 1:
816     l = r = atoi(vec[0]);
817     set = 1;
818     break;
819   case 2:
820     l = atoi(vec[0]);
821     r = atoi(vec[1]);
822     set = 1;
823     break;
824   default:
825     abort();
826   }
827   rights = set ? RIGHT_VOLUME : RIGHT_READ;
828   if(!(c->rights & rights)) {
829     error(0, "%s attempted to set volume but lacks required rights", c->who);
830     sink_writes(ev_writer_sink(c->w), "510 Prohibited\n");
831     return 1;
832   }
833   if(mixer_control(-1/*as configured*/, &l, &r, set))
834     sink_writes(ev_writer_sink(c->w), "550 error accessing mixer\n");
835   else {
836     sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r);
837     if(l != volume_left || r != volume_right) {
838       volume_left = l;
839       volume_right = r;
840       snprintf(lb, sizeof lb, "%d", l);
841       snprintf(rb, sizeof rb, "%d", r);
842       eventlog("volume", lb, rb, (char *)0);
843     }
844   }
845   return 1;
846 }
847
848 /** @brief Called when data arrives on a log connection
849  *
850  * We just discard all such data.  The client may occasionally send data as a
851  * keepalive.
852  */
853 static int logging_reader_callback(ev_source attribute((unused)) *ev,
854                                    ev_reader *reader,
855                                    void attribute((unused)) *ptr,
856                                    size_t bytes,
857                                    int attribute((unused)) eof,
858                                    void attribute((unused)) *u) {
859   struct conn *c = u;
860
861   ev_reader_consume(reader, bytes);
862   if(eof) {
863     /* Oops, that's all for now */
864     D(("logging reader eof"));
865     if(c->w) {
866       D(("close writer"));
867       ev_writer_close(c->w);
868       c->w = 0;
869     }
870     c->r = 0;
871     remove_connection(c);
872   }
873   return 0;
874 }
875
876 static void logclient(const char *msg, void *user) {
877   struct conn *c = user;
878
879   if(!c->w || !c->r) {
880     /* This connection has gone up in smoke for some reason */
881     eventlog_remove(c->lo);
882     c->lo = 0;
883     return;
884   }
885   /* user_* messages are restricted */
886   if(!strncmp(msg, "user_", 5)) {
887     /* They are only sent to admin users */
888     if(!(c->rights & RIGHT_ADMIN))
889       return;
890     /* They are not sent over TCP connections unless remote user-management is
891      * enabled */
892     if(!config->remote_userman && !(c->rights & RIGHT__LOCAL))
893       return;
894   }
895   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" %s\n",
896               (uintmax_t)time(0), msg);
897 }
898
899 static int c_log(struct conn *c,
900                  char attribute((unused)) **vec,
901                  int attribute((unused)) nvec) {
902   time_t now;
903
904   sink_writes(ev_writer_sink(c->w), "254 OK\n");
905   /* pump out initial state */
906   time(&now);
907   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" state %s\n",
908               (uintmax_t)now, 
909               playing_is_enabled() ? "enable_play" : "disable_play");
910   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" state %s\n",
911               (uintmax_t)now, 
912               random_is_enabled() ? "enable_random" : "disable_random");
913   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" state %s\n",
914               (uintmax_t)now, 
915               paused ? "pause" : "resume");
916   if(playing)
917     sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" state playing\n",
918                 (uintmax_t)now);
919   /* Initial volume */
920   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" volume %d %d\n",
921               (uintmax_t)now, volume_left, volume_right);
922   c->lo = xmalloc(sizeof *c->lo);
923   c->lo->fn = logclient;
924   c->lo->user = c;
925   eventlog_add(c->lo);
926   c->reader = logging_reader_callback;
927   return 0;
928 }
929
930 /** @brief Test whether a move is allowed
931  * @param c Connection
932  * @param qs List of IDs on queue
933  * @param nqs Number of IDs
934  * @return 0 if move is prohibited, non-0 if it is allowed
935  */
936 static int has_move_rights(struct conn *c, struct queue_entry **qs, int nqs) {
937   for(; nqs > 0; ++qs, --nqs) {
938     struct queue_entry *const q = *qs;
939
940     if(!right_movable(c->rights, c->who, q))
941       return 0;
942   }
943   return 1;
944 }
945
946 static int c_move(struct conn *c,
947                   char **vec,
948                   int attribute((unused)) nvec) {
949   struct queue_entry *q;
950   int n;
951
952   if(!(q = queue_find(vec[0]))) {
953     sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n");
954     return 1;
955   }
956   if(!has_move_rights(c, &q, 1)) {
957     error(0, "%s attempted move but lacks required rights", c->who);
958     sink_writes(ev_writer_sink(c->w),
959                 "510 Not authorized to move that track\n");
960     return 1;
961   }
962   n = queue_move(q, atoi(vec[1]), c->who);
963   sink_printf(ev_writer_sink(c->w), "252 %d\n", n);
964   /* If we've moved to the head of the queue then prepare the track. */
965   if(q == qhead.next)
966     prepare(c->ev, q);
967   return 1;
968 }
969
970 static int c_moveafter(struct conn *c,
971                        char **vec,
972                        int attribute((unused)) nvec) {
973   struct queue_entry *q, **qs;
974   int n;
975
976   if(vec[0][0]) {
977     if(!(q = queue_find(vec[0]))) {
978       sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n");
979       return 1;
980     }
981   } else
982     q = 0;
983   ++vec;
984   --nvec;
985   qs = xcalloc(nvec, sizeof *qs);
986   for(n = 0; n < nvec; ++n)
987     if(!(qs[n] = queue_find(vec[n]))) {
988       sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n");
989       return 1;
990     }
991   if(!has_move_rights(c, qs, nvec)) {
992     error(0, "%s attempted moveafter but lacks required rights", c->who);
993     sink_writes(ev_writer_sink(c->w),
994                 "510 Not authorized to move those tracks\n");
995     return 1;
996   }
997   queue_moveafter(q, nvec, qs, c->who);
998   sink_printf(ev_writer_sink(c->w), "250 Moved tracks\n");
999   /* If we've moved to the head of the queue then prepare the track. */
1000   if(q == qhead.next)
1001     prepare(c->ev, q);
1002   return 1;
1003 }
1004
1005 static int c_part(struct conn *c,
1006                   char **vec,
1007                   int attribute((unused)) nvec) {
1008   const char *track;
1009
1010   if(!(track = trackdb_resolve(vec[0]))) {
1011     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
1012     return 1;
1013   }
1014   sink_printf(ev_writer_sink(c->w), "252 %s\n",
1015               quoteutf8(trackdb_getpart(track, vec[1], vec[2])));
1016   return 1;
1017 }
1018
1019 static int c_resolve(struct conn *c,
1020                      char **vec,
1021                      int attribute((unused)) nvec) {
1022   const char *track;
1023
1024   if(!(track = trackdb_resolve(vec[0]))) {
1025     sink_writes(ev_writer_sink(c->w), "550 cannot resolve track\n");
1026     return 1;
1027   }
1028   sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(track));
1029   return 1;
1030 }
1031
1032 static int c_tags(struct conn *c,
1033                   char attribute((unused)) **vec,
1034                   int attribute((unused)) nvec) {
1035   char **tags = trackdb_alltags();
1036   
1037   sink_printf(ev_writer_sink(c->w), "253 Tag list follows\n");
1038   while(*tags) {
1039     sink_printf(ev_writer_sink(c->w), "%s%s\n",
1040                 **tags == '.' ? "." : "", *tags);
1041     ++tags;
1042   }
1043   sink_writes(ev_writer_sink(c->w), ".\n");
1044   return 1;                             /* completed */
1045 }
1046
1047 static int c_set_global(struct conn *c,
1048                         char **vec,
1049                         int attribute((unused)) nvec) {
1050   if(vec[0][0] == '_') {
1051     sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n");
1052     return 1;
1053   }
1054   trackdb_set_global(vec[0], vec[1], c->who);
1055   sink_printf(ev_writer_sink(c->w), "250 OK\n");
1056   return 1;
1057 }
1058
1059 static int c_get_global(struct conn *c,
1060                         char **vec,
1061                         int attribute((unused)) nvec) {
1062   const char *s = trackdb_get_global(vec[0]);
1063
1064   if(s)
1065     sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(s));
1066   else
1067     sink_writes(ev_writer_sink(c->w), "555 not found\n");
1068   return 1;
1069 }
1070
1071 static int c_nop(struct conn *c,
1072                  char attribute((unused)) **vec,
1073                  int attribute((unused)) nvec) {
1074   sink_printf(ev_writer_sink(c->w), "250 Quack\n");
1075   return 1;
1076 }
1077
1078 static int c_new(struct conn *c,
1079                  char **vec,
1080                  int nvec) {
1081   int max, n;
1082   char **tracks;
1083
1084   if(nvec > 0)
1085     max = atoi(vec[0]);
1086   else
1087     max = INT_MAX;
1088   if(max <= 0 || max > config->new_max)
1089     max = config->new_max;
1090   tracks = trackdb_new(0, max);
1091   sink_printf(ev_writer_sink(c->w), "253 New track list follows\n");
1092   n = 0;
1093   while(*tracks) {
1094     sink_printf(ev_writer_sink(c->w), "%s%s\n",
1095                 **tracks == '.' ? "." : "", *tracks);
1096     ++tracks;
1097   }
1098   sink_writes(ev_writer_sink(c->w), ".\n");
1099   return 1;                             /* completed */
1100
1101 }
1102
1103 static int c_rtp_address(struct conn *c,
1104                          char attribute((unused)) **vec,
1105                          int attribute((unused)) nvec) {
1106   if(config->api == BACKEND_NETWORK) {
1107     sink_printf(ev_writer_sink(c->w), "252 %s %s\n",
1108                 quoteutf8(config->broadcast.s[0]),
1109                 quoteutf8(config->broadcast.s[1]));
1110   } else
1111     sink_writes(ev_writer_sink(c->w), "550 No RTP\n");
1112   return 1;
1113 }
1114
1115 static int c_cookie(struct conn *c,
1116                     char **vec,
1117                     int attribute((unused)) nvec) {
1118   const char *host;
1119   char *user;
1120   rights_type rights;
1121
1122   /* Can't log in twice on the same connection */
1123   if(c->who) {
1124     sink_writes(ev_writer_sink(c->w), "530 already authenticated\n");
1125     return 1;
1126   }
1127   /* Get some kind of peer identifcation */
1128   if(!(host = connection_host(c))) {
1129     sink_writes(ev_writer_sink(c->w), "530 authentication failure\n");
1130     return 1;
1131   }
1132   /* Check the cookie */
1133   user = verify_cookie(vec[0], &rights);
1134   if(!user) {
1135     sink_writes(ev_writer_sink(c->w), "530 authentication failure\n");
1136     return 1;
1137   }
1138   /* Log in */
1139   c->who = user;
1140   c->cookie = vec[0];
1141   c->rights = rights;
1142   if(strcmp(host, "local"))
1143     info("S%x %s connected with cookie from %s", c->tag, user, host);
1144   else
1145     c->rights |= RIGHT__LOCAL;
1146   /* Response contains username so client knows who they are acting as */
1147   sink_printf(ev_writer_sink(c->w), "232 %s\n", quoteutf8(user));
1148   return 1;
1149 }
1150
1151 static int c_make_cookie(struct conn *c,
1152                          char attribute((unused)) **vec,
1153                          int attribute((unused)) nvec) {
1154   const char *cookie = make_cookie(c->who);
1155
1156   if(cookie)
1157     sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(cookie));
1158   else
1159     sink_writes(ev_writer_sink(c->w), "550 Cannot create cookie\n");
1160   return 1;
1161 }
1162
1163 static int c_revoke(struct conn *c,
1164                     char attribute((unused)) **vec,
1165                     int attribute((unused)) nvec) {
1166   if(c->cookie) {
1167     revoke_cookie(c->cookie);
1168     sink_writes(ev_writer_sink(c->w), "250 OK\n");
1169   } else
1170     sink_writes(ev_writer_sink(c->w), "550 Did not log in with cookie\n");
1171   return 1;
1172 }
1173
1174 static int c_adduser(struct conn *c,
1175                      char **vec,
1176                      int nvec) {
1177   const char *rights;
1178
1179   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
1180     error(0, "S%x: remote adduser", c->tag);
1181     sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
1182     return 1;
1183   }
1184   if(nvec > 2) {
1185     rights = vec[2];
1186     if(parse_rights(vec[2], 0, 1)) {
1187       sink_writes(ev_writer_sink(c->w), "550 Invalid rights list\n");
1188       return -1;
1189     }
1190   } else
1191     rights = config->default_rights;
1192   if(trackdb_adduser(vec[0], vec[1], rights,
1193                      0/*email*/, 0/*confirmation*/))
1194     sink_writes(ev_writer_sink(c->w), "550 Cannot create user\n");
1195   else
1196     sink_writes(ev_writer_sink(c->w), "250 User created\n");
1197   return 1;
1198 }
1199
1200 static int c_deluser(struct conn *c,
1201                      char **vec,
1202                      int attribute((unused)) nvec) {
1203   struct conn *d;
1204
1205   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
1206     error(0, "S%x: remote deluser", c->tag);
1207     sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
1208     return 1;
1209   }
1210   if(trackdb_deluser(vec[0])) {
1211     sink_writes(ev_writer_sink(c->w), "550 Cannot delete user\n");
1212     return 1;
1213   }
1214   /* Zap connections belonging to deleted user */
1215   for(d = connections; d; d = d->next)
1216     if(!strcmp(d->who, vec[0]))
1217       d->rights = 0;
1218   sink_writes(ev_writer_sink(c->w), "250 User deleted\n");
1219   return 1;
1220 }
1221
1222 static int c_edituser(struct conn *c,
1223                       char **vec,
1224                       int attribute((unused)) nvec) {
1225   struct conn *d;
1226
1227   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
1228     error(0, "S%x: remote edituser", c->tag);
1229     sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
1230     return 1;
1231   }
1232   /* RIGHT_ADMIN can do anything; otherwise you can only set your own email
1233    * address and password. */
1234   if((c->rights & RIGHT_ADMIN)
1235      || (!strcmp(c->who, vec[0])
1236          && (!strcmp(vec[1], "email")
1237              || !strcmp(vec[1], "password")))) {
1238     if(trackdb_edituserinfo(vec[0], vec[1], vec[2])) {
1239       sink_writes(ev_writer_sink(c->w), "550 Failed to change setting\n");
1240       return 1;
1241     }
1242     if(!strcmp(vec[1], "password")) {
1243       /* Zap all connections for this user after a password change */
1244       for(d = connections; d; d = d->next)
1245         if(!strcmp(d->who, vec[0]))
1246           d->rights = 0;
1247     } else if(!strcmp(vec[1], "rights")) {
1248       /* Update rights for this user */
1249       rights_type r;
1250
1251       if(!parse_rights(vec[2], &r, 1)) {
1252         const char *new_rights = rights_string(r);
1253         for(d = connections; d; d = d->next) {
1254           if(!strcmp(d->who, vec[0])) {
1255             /* Update rights */
1256             d->rights = r;
1257             /* Notify any log connections */
1258             if(d->lo)
1259               sink_printf(ev_writer_sink(d->w),
1260                           "%"PRIxMAX" rights_changed %s\n",
1261                           (uintmax_t)time(0),
1262                           quoteutf8(new_rights));
1263           }
1264         }
1265       }
1266     }
1267     sink_writes(ev_writer_sink(c->w), "250 OK\n");
1268   } else {
1269     error(0, "%s attempted edituser but lacks required rights", c->who);
1270     sink_writes(ev_writer_sink(c->w), "510 Restricted to administrators\n");
1271   }
1272   return 1;
1273 }
1274
1275 static int c_userinfo(struct conn *c,
1276                       char attribute((unused)) **vec,
1277                       int attribute((unused)) nvec) {
1278   struct kvp *k;
1279   const char *value;
1280
1281   /* We allow remote querying of rights so that clients can figure out what
1282    * they're allowed to do */
1283   if(!config->remote_userman
1284      && !(c->rights & RIGHT__LOCAL)
1285      && strcmp(vec[1], "rights")) {
1286     error(0, "S%x: remote userinfo %s %s", c->tag, vec[0], vec[1]);
1287     sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
1288     return 1;
1289   }
1290   /* RIGHT_ADMIN allows anything; otherwise you can only get your own email
1291    * address and rights list. */
1292   if((c->rights & RIGHT_ADMIN)
1293      || (!strcmp(c->who, vec[0])
1294          && (!strcmp(vec[1], "email")
1295              || !strcmp(vec[1], "rights")))) {
1296     if((k = trackdb_getuserinfo(vec[0])))
1297       if((value = kvp_get(k, vec[1])))
1298         sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(value));
1299       else
1300         sink_writes(ev_writer_sink(c->w), "555 Not set\n");
1301     else
1302       sink_writes(ev_writer_sink(c->w), "550 No such user\n");
1303   } else {
1304     error(0, "%s attempted userinfo but lacks required rights", c->who);
1305     sink_writes(ev_writer_sink(c->w), "510 Restricted to administrators\n");
1306   }
1307   return 1;
1308 }
1309
1310 static int c_users(struct conn *c,
1311                    char attribute((unused)) **vec,
1312                    int attribute((unused)) nvec) {
1313   /* TODO de-dupe with c_tags */
1314   char **users = trackdb_listusers();
1315
1316   sink_writes(ev_writer_sink(c->w), "253 User list follows\n");
1317   while(*users) {
1318     sink_printf(ev_writer_sink(c->w), "%s%s\n",
1319                 **users == '.' ? "." : "", *users);
1320     ++users;
1321   }
1322   sink_writes(ev_writer_sink(c->w), ".\n");
1323   return 1;                             /* completed */
1324 }
1325
1326 static int c_register(struct conn *c,
1327                       char **vec,
1328                       int attribute((unused)) nvec) {
1329   char *cs;
1330   uint32_t nonce[CONFIRM_SIZE];
1331   char nonce_str[(32 * CONFIRM_SIZE) / 5 + 1];
1332
1333   /* The confirmation string is username/base62(nonce).  The confirmation
1334    * process will pick the username back out to identify them but the _whole_
1335    * string is used as the confirmation string.  Base 62 means we used only
1336    * letters and digits, minimizing the chance of the URL being mispasted. */
1337   gcry_randomize(nonce, sizeof nonce, GCRY_STRONG_RANDOM);
1338   if(basen(nonce, CONFIRM_SIZE, nonce_str, sizeof nonce_str, 62)) {
1339     error(0, "buffer too small encoding confirmation string");
1340     sink_writes(ev_writer_sink(c->w), "550 Cannot create user\n");
1341   }
1342   byte_xasprintf(&cs, "%s/%s", vec[0], nonce_str);
1343   if(trackdb_adduser(vec[0], vec[1], config->default_rights, vec[2], cs))
1344     sink_writes(ev_writer_sink(c->w), "550 Cannot create user\n");
1345   else
1346     sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(cs));
1347   return 1;
1348 }
1349
1350 static int c_confirm(struct conn *c,
1351                      char **vec,
1352                      int attribute((unused)) nvec) {
1353   char *user, *sep;
1354   rights_type rights;
1355   const char *host;
1356
1357   /* Get some kind of peer identifcation */
1358   if(!(host = connection_host(c))) {
1359     sink_writes(ev_writer_sink(c->w), "530 Authentication failure\n");
1360     return 1;
1361   }
1362   /* Picking the LAST / means we don't (here) rule out slashes in usernames. */
1363   if(!(sep = strrchr(vec[0], '/'))) {
1364     sink_writes(ev_writer_sink(c->w), "550 Malformed confirmation string\n");
1365     return 1;
1366   }
1367   user = xstrndup(vec[0], sep - vec[0]);
1368   if(trackdb_confirm(user, vec[0], &rights))
1369     sink_writes(ev_writer_sink(c->w), "550 Incorrect confirmation string\n");
1370   else {
1371     c->who = user;
1372     c->cookie = 0;
1373     c->rights = rights;
1374     if(strcmp(host, "local"))
1375       info("S%x %s confirmed from %s", c->tag, user, host);
1376     else
1377       c->rights |= RIGHT__LOCAL;
1378     /* Response contains username so client knows who they are acting as */
1379     sink_printf(ev_writer_sink(c->w), "232 %s\n", quoteutf8(user));
1380   }
1381   return 1;
1382 }
1383
1384 static int sent_reminder(ev_source attribute((unused)) *ev,
1385                          pid_t attribute((unused)) pid,
1386                          int status,
1387                          const struct rusage attribute((unused)) *rusage,
1388                          void *u) {
1389   struct conn *const c = u;
1390
1391   /* Tell the client what went down */ 
1392   if(!status) {
1393     sink_writes(ev_writer_sink(c->w), "250 OK\n");
1394   } else {
1395     error(0, "reminder subprocess %s", wstat(status));
1396     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1397   }
1398   /* Re-enable this connection */
1399   ev_reader_enable(c->r);
1400   return 0;
1401 }
1402
1403 static int c_reminder(struct conn *c,
1404                       char **vec,
1405                       int attribute((unused)) nvec) {
1406   struct kvp *k;
1407   const char *password, *email, *text, *encoding, *charset, *content_type;
1408   const time_t *last;
1409   time_t now;
1410   pid_t pid;
1411   
1412   static hash *last_reminder;
1413
1414   if(!config->mail_sender) {
1415     error(0, "cannot send password reminders because mail_sender not set");
1416     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1417     return 1;
1418   }
1419   if(!(k = trackdb_getuserinfo(vec[0]))) {
1420     error(0, "reminder for user '%s' who does not exist", vec[0]);
1421     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1422     return 1;
1423   }
1424   if(!(email = kvp_get(k, "email"))
1425      || !email_valid(email)) {
1426     error(0, "user '%s' has no valid email address", vec[0]);
1427     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1428     return 1;
1429   }
1430   if(!(password = kvp_get(k, "password"))
1431      || !*password) {
1432     error(0, "user '%s' has no password", vec[0]);
1433     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1434     return 1;
1435   }
1436   /* Rate-limit reminders.  This hash is bounded in size by the number of
1437    * users.  If this is actually a problem for anyone then we can periodically
1438    * clean it. */
1439   if(!last_reminder)
1440     last_reminder = hash_new(sizeof (time_t));
1441   last = hash_find(last_reminder, vec[0]);
1442   time(&now);
1443   if(last && now < *last + config->reminder_interval) {
1444     error(0, "sent a password reminder to '%s' too recently", vec[0]);
1445     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1446     return 1;
1447   }
1448   /* Send the reminder */
1449   /* TODO this should be templatized and to some extent merged with
1450    * the code in act_register() */
1451   byte_xasprintf((char **)&text,
1452 "Someone requested that you be sent a reminder of your DisOrder password.\n"
1453 "Your password is:\n"
1454 "\n"
1455 "  %s\n", password);
1456   if(!(text = mime_encode_text(text, &charset, &encoding)))
1457     fatal(0, "cannot encode email");
1458   byte_xasprintf((char **)&content_type, "text/plain;charset=%s",
1459                  quote822(charset, 0));
1460   pid = sendmail_subprocess("", config->mail_sender, email,
1461                             "DisOrder password reminder",
1462                             encoding, content_type, text);
1463   if(pid < 0) {
1464     sink_writes(ev_writer_sink(c->w), "550 Cannot send a reminder email\n");
1465     return 1;
1466   }
1467   hash_add(last_reminder, vec[0], &now, HASH_INSERT_OR_REPLACE);
1468   info("sending a passsword reminder to user '%s'", vec[0]);
1469   /* We can only continue when the subprocess finishes */
1470   ev_child(c->ev, pid, 0, sent_reminder, c);
1471   return 0;
1472 }
1473
1474 static int c_schedule_list(struct conn *c,
1475                            char attribute((unused)) **vec,
1476                            int attribute((unused)) nvec) {
1477   char **ids = schedule_list(0);
1478   sink_writes(ev_writer_sink(c->w), "253 ID list follows\n");
1479   while(*ids)
1480     sink_printf(ev_writer_sink(c->w), "%s\n", *ids++);
1481   sink_writes(ev_writer_sink(c->w), ".\n");
1482   return 1;                             /* completed */
1483 }
1484
1485 static int c_schedule_get(struct conn *c,
1486                           char **vec,
1487                           int attribute((unused)) nvec) {
1488   struct kvp *actiondata = schedule_get(vec[0]), *k;
1489
1490   if(!actiondata) {
1491     sink_writes(ev_writer_sink(c->w), "555 No such event\n");
1492     return 1;                           /* completed */
1493   }
1494   /* Scheduled events are public information.  Anyone with RIGHT_READ can see
1495    * them. */
1496   sink_writes(ev_writer_sink(c->w), "253 Event information follows\n");
1497   for(k = actiondata; k; k = k->next)
1498     sink_printf(ev_writer_sink(c->w), " %s %s\n",
1499                 quoteutf8(k->name),  quoteutf8(k->value));
1500   sink_writes(ev_writer_sink(c->w), ".\n");
1501   return 1;                             /* completed */
1502 }
1503
1504 static int c_schedule_del(struct conn *c,
1505                           char **vec,
1506                           int attribute((unused)) nvec) {
1507   struct kvp *actiondata = schedule_get(vec[0]);
1508
1509   if(!actiondata) {
1510     sink_writes(ev_writer_sink(c->w), "555 No such event\n");
1511     return 1;                           /* completed */
1512   }
1513   /* If you have admin rights you can delete anything.  If you don't then you
1514    * can only delete your own scheduled events. */
1515   if(!(c->rights & RIGHT_ADMIN)) {
1516     const char *who = kvp_get(actiondata, "who");
1517
1518     if(!who || !c->who || strcmp(who, c->who)) {
1519       sink_writes(ev_writer_sink(c->w), "551 Not authorized\n");
1520       return 1;                         /* completed */
1521     }
1522   }
1523   if(schedule_del(vec[0]))
1524     sink_writes(ev_writer_sink(c->w), "550 Could not delete scheduled event\n");
1525   else
1526     sink_writes(ev_writer_sink(c->w), "250 Deleted\n");
1527   return 1;                             /* completed */
1528 }
1529
1530 static int c_schedule_add(struct conn *c,
1531                           char **vec,
1532                           int nvec) {
1533   struct kvp *actiondata = 0;
1534   const char *id;
1535
1536   /* Standard fields */
1537   kvp_set(&actiondata, "who", c->who);
1538   kvp_set(&actiondata, "when", vec[0]);
1539   kvp_set(&actiondata, "priority", vec[1]);
1540   kvp_set(&actiondata, "action", vec[2]);
1541   /* Action-dependent fields */
1542   if(!strcmp(vec[2], "play")) {
1543     if(nvec != 4) {
1544       sink_writes(ev_writer_sink(c->w), "550 Wrong number of arguments\n");
1545       return 1;
1546     }
1547     if(!trackdb_exists(vec[3])) {
1548       sink_writes(ev_writer_sink(c->w), "550 Track is not in database\n");
1549       return 1;
1550     }
1551     kvp_set(&actiondata, "track", vec[3]);
1552   } else if(!strcmp(vec[2], "set-global")) {
1553     if(nvec < 4 || nvec > 5) {
1554       sink_writes(ev_writer_sink(c->w), "550 Wrong number of arguments\n");
1555       return 1;
1556     }
1557     kvp_set(&actiondata, "key", vec[3]);
1558     if(nvec > 4)
1559       kvp_set(&actiondata, "value", vec[4]);
1560   } else {
1561     sink_writes(ev_writer_sink(c->w), "550 Unknown action\n");
1562     return 1;
1563   }
1564   /* schedule_add() checks user rights */
1565   id = schedule_add(c->ev, actiondata);
1566   if(!id)
1567     sink_writes(ev_writer_sink(c->w), "550 Cannot add scheduled event\n");
1568   else
1569     sink_printf(ev_writer_sink(c->w), "252 %s\n", id);
1570   return 1;
1571 }
1572
1573 static int c_adopt(struct conn *c,
1574                    char **vec,
1575                    int attribute((unused)) nvec) {
1576   struct queue_entry *q;
1577
1578   if(!c->who) {
1579     sink_writes(ev_writer_sink(c->w), "550 no identity\n");
1580     return 1;
1581   }
1582   if(!(q = queue_find(vec[0]))) {
1583     sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n");
1584     return 1;
1585   }
1586   if(q->origin != origin_random) {
1587     sink_writes(ev_writer_sink(c->w), "550 not a random track\n");
1588     return 1;
1589   }
1590   q->origin = origin_adopted;
1591   q->submitter = xstrdup(c->who);
1592   eventlog("adopted", q->id, q->submitter, (char *)0);
1593   queue_write();
1594   sink_writes(ev_writer_sink(c->w), "250 OK\n");
1595   return 1;
1596 }
1597
1598 static const struct command {
1599   /** @brief Command name */
1600   const char *name;
1601
1602   /** @brief Minimum number of arguments */
1603   int minargs;
1604
1605   /** @brief Maximum number of arguments */
1606   int maxargs;
1607
1608   /** @brief Function to process command */
1609   int (*fn)(struct conn *, char **, int);
1610
1611   /** @brief Rights required to execute command
1612    *
1613    * 0 means that the command can be issued without logging in.  If multiple
1614    * bits are listed here any of those rights will do.
1615    */
1616   rights_type rights;
1617 } commands[] = {
1618   { "adduser",        2, 3,       c_adduser,        RIGHT_ADMIN|RIGHT__LOCAL },
1619   { "adopt",          1, 1,       c_adopt,          RIGHT_PLAY },
1620   { "allfiles",       0, 2,       c_allfiles,       RIGHT_READ },
1621   { "confirm",        1, 1,       c_confirm,        0 },
1622   { "cookie",         1, 1,       c_cookie,         0 },
1623   { "deluser",        1, 1,       c_deluser,        RIGHT_ADMIN|RIGHT__LOCAL },
1624   { "dirs",           0, 2,       c_dirs,           RIGHT_READ },
1625   { "disable",        0, 1,       c_disable,        RIGHT_GLOBAL_PREFS },
1626   { "edituser",       3, 3,       c_edituser,       RIGHT_ADMIN|RIGHT_USERINFO },
1627   { "enable",         0, 0,       c_enable,         RIGHT_GLOBAL_PREFS },
1628   { "enabled",        0, 0,       c_enabled,        RIGHT_READ },
1629   { "exists",         1, 1,       c_exists,         RIGHT_READ },
1630   { "files",          0, 2,       c_files,          RIGHT_READ },
1631   { "get",            2, 2,       c_get,            RIGHT_READ },
1632   { "get-global",     1, 1,       c_get_global,     RIGHT_READ },
1633   { "length",         1, 1,       c_length,         RIGHT_READ },
1634   { "log",            0, 0,       c_log,            RIGHT_READ },
1635   { "make-cookie",    0, 0,       c_make_cookie,    RIGHT_READ },
1636   { "move",           2, 2,       c_move,           RIGHT_MOVE__MASK },
1637   { "moveafter",      1, INT_MAX, c_moveafter,      RIGHT_MOVE__MASK },
1638   { "new",            0, 1,       c_new,            RIGHT_READ },
1639   { "nop",            0, 0,       c_nop,            0 },
1640   { "part",           3, 3,       c_part,           RIGHT_READ },
1641   { "pause",          0, 0,       c_pause,          RIGHT_PAUSE },
1642   { "play",           1, 1,       c_play,           RIGHT_PLAY },
1643   { "playing",        0, 0,       c_playing,        RIGHT_READ },
1644   { "prefs",          1, 1,       c_prefs,          RIGHT_READ },
1645   { "queue",          0, 0,       c_queue,          RIGHT_READ },
1646   { "random-disable", 0, 0,       c_random_disable, RIGHT_GLOBAL_PREFS },
1647   { "random-enable",  0, 0,       c_random_enable,  RIGHT_GLOBAL_PREFS },
1648   { "random-enabled", 0, 0,       c_random_enabled, RIGHT_READ },
1649   { "recent",         0, 0,       c_recent,         RIGHT_READ },
1650   { "reconfigure",    0, 0,       c_reconfigure,    RIGHT_ADMIN },
1651   { "register",       3, 3,       c_register,       RIGHT_REGISTER|RIGHT__LOCAL },
1652   { "reminder",       1, 1,       c_reminder,       RIGHT__LOCAL },
1653   { "remove",         1, 1,       c_remove,         RIGHT_REMOVE__MASK },
1654   { "rescan",         0, INT_MAX, c_rescan,         RIGHT_RESCAN },
1655   { "resolve",        1, 1,       c_resolve,        RIGHT_READ },
1656   { "resume",         0, 0,       c_resume,         RIGHT_PAUSE },
1657   { "revoke",         0, 0,       c_revoke,         RIGHT_READ },
1658   { "rtp-address",    0, 0,       c_rtp_address,    0 },
1659   { "schedule-add",   3, INT_MAX, c_schedule_add,   RIGHT_READ },
1660   { "schedule-del",   1, 1,       c_schedule_del,   RIGHT_READ },
1661   { "schedule-get",   1, 1,       c_schedule_get,   RIGHT_READ },
1662   { "schedule-list",  0, 0,       c_schedule_list,  RIGHT_READ },
1663   { "scratch",        0, 1,       c_scratch,        RIGHT_SCRATCH__MASK },
1664   { "search",         1, 1,       c_search,         RIGHT_READ },
1665   { "set",            3, 3,       c_set,            RIGHT_PREFS, },
1666   { "set-global",     2, 2,       c_set_global,     RIGHT_GLOBAL_PREFS },
1667   { "shutdown",       0, 0,       c_shutdown,       RIGHT_ADMIN },
1668   { "stats",          0, 0,       c_stats,          RIGHT_READ },
1669   { "tags",           0, 0,       c_tags,           RIGHT_READ },
1670   { "unset",          2, 2,       c_set,            RIGHT_PREFS },
1671   { "unset-global",   1, 1,       c_set_global,     RIGHT_GLOBAL_PREFS },
1672   { "user",           2, 2,       c_user,           0 },
1673   { "userinfo",       2, 2,       c_userinfo,       RIGHT_READ },
1674   { "users",          0, 0,       c_users,          RIGHT_READ },
1675   { "version",        0, 0,       c_version,        RIGHT_READ },
1676   { "volume",         0, 2,       c_volume,         RIGHT_READ|RIGHT_VOLUME }
1677 };
1678
1679 static void command_error(const char *msg, void *u) {
1680   struct conn *c = u;
1681
1682   sink_printf(ev_writer_sink(c->w), "500 parse error: %s\n", msg);
1683 }
1684
1685 /* process a command.  Return 1 if complete, 0 if incomplete. */
1686 static int command(struct conn *c, char *line) {
1687   char **vec;
1688   int nvec, n;
1689
1690   D(("server command %s", line));
1691   /* We force everything into NFC as early as possible */
1692   if(!(line = utf8_compose_canon(line, strlen(line), 0))) {
1693     sink_writes(ev_writer_sink(c->w), "500 cannot normalize command\n");
1694     return 1;
1695   }
1696   if(!(vec = split(line, &nvec, SPLIT_QUOTES, command_error, c))) {
1697     sink_writes(ev_writer_sink(c->w), "500 cannot parse command\n");
1698     return 1;
1699   }
1700   if(nvec == 0) {
1701     sink_writes(ev_writer_sink(c->w), "500 do what?\n");
1702     return 1;
1703   }
1704   if((n = TABLE_FIND(commands, name, vec[0])) < 0)
1705     sink_writes(ev_writer_sink(c->w), "500 unknown command\n");
1706   else {
1707     if(commands[n].rights
1708        && !(c->rights & commands[n].rights)) {
1709       error(0, "%s attempted %s but lacks required rights", c->who ? c->who : "NULL",
1710             commands[n].name);
1711       sink_writes(ev_writer_sink(c->w), "510 Prohibited\n");
1712       return 1;
1713     }
1714     ++vec;
1715     --nvec;
1716     if(nvec < commands[n].minargs) {
1717       sink_writes(ev_writer_sink(c->w), "500 missing argument(s)\n");
1718       return 1;
1719     }
1720     if(nvec > commands[n].maxargs) {
1721       sink_writes(ev_writer_sink(c->w), "500 too many arguments\n");
1722       return 1;
1723     }
1724     return commands[n].fn(c, vec, nvec);
1725   }
1726   return 1;                     /* completed */
1727 }
1728
1729 /* redirect to the right reader callback for our current state */
1730 static int redirect_reader_callback(ev_source *ev,
1731                                     ev_reader *reader,
1732                                     void *ptr,
1733                                     size_t bytes,
1734                                     int eof,
1735                                     void *u) {
1736   struct conn *c = u;
1737
1738   return c->reader(ev, reader, ptr, bytes, eof, u);
1739 }
1740
1741 /* the main command reader */
1742 static int reader_callback(ev_source attribute((unused)) *ev,
1743                            ev_reader *reader,
1744                            void *ptr,
1745                            size_t bytes,
1746                            int eof,
1747                            void *u) {
1748   struct conn *c = u;
1749   char *eol;
1750   int complete;
1751
1752   D(("server reader_callback"));
1753   while((eol = memchr(ptr, '\n', bytes))) {
1754     *eol++ = 0;
1755     ev_reader_consume(reader, eol - (char *)ptr);
1756     complete = command(c, ptr);
1757     bytes -= (eol - (char *)ptr);
1758     ptr = eol;
1759     if(!complete) {
1760       /* the command had better have set a new reader callback */
1761       if(bytes || eof)
1762         /* there are further bytes to read, or we are at eof; arrange for the
1763          * command's reader callback to handle them */
1764         return ev_reader_incomplete(reader);
1765       /* nothing's going on right now */
1766       return 0;
1767     }
1768     /* command completed, we can go around and handle the next one */
1769   }
1770   if(eof) {
1771     if(bytes)
1772       error(0, "S%x unterminated line", c->tag);
1773     D(("normal reader close"));
1774     c->r = 0;
1775     if(c->w) {
1776       D(("close associated writer"));
1777       ev_writer_close(c->w);
1778       c->w = 0;
1779     }
1780     remove_connection(c);
1781   }
1782   return 0;
1783 }
1784
1785 static int listen_callback(ev_source *ev,
1786                            int fd,
1787                            const struct sockaddr attribute((unused)) *remote,
1788                            socklen_t attribute((unused)) rlen,
1789                            void *u) {
1790   const struct listener *l = u;
1791   struct conn *c = xmalloc(sizeof *c);
1792   static unsigned tags;
1793
1794   D(("server listen_callback fd %d (%s)", fd, l->name));
1795   nonblock(fd);
1796   cloexec(fd);
1797   c->next = connections;
1798   c->tag = tags++;
1799   c->ev = ev;
1800   c->w = ev_writer_new(ev, fd, writer_error, c,
1801                        "client writer");
1802   if(!c->w) {
1803     error(0, "ev_writer_new for file inbound connection (fd=%d) failed",
1804           fd);
1805     close(fd);
1806     return 0;
1807   }
1808   c->r = ev_reader_new(ev, fd, redirect_reader_callback, reader_error, c,
1809                        "client reader");
1810   if(!c->r)
1811     /* Main reason for failure is the FD is too big and that will already have
1812      * been handled */
1813     fatal(0, "ev_reader_new for file inbound connection (fd=%d) failed", fd);
1814   ev_tie(c->r, c->w);
1815   c->fd = fd;
1816   c->reader = reader_callback;
1817   c->l = l;
1818   c->rights = 0;
1819   connections = c;
1820   gcry_randomize(c->nonce, sizeof c->nonce, GCRY_STRONG_RANDOM);
1821   sink_printf(ev_writer_sink(c->w), "231 %d %s %s\n",
1822               2,
1823               config->authorization_algorithm,
1824               hex(c->nonce, sizeof c->nonce));
1825   return 0;
1826 }
1827
1828 int server_start(ev_source *ev, int pf,
1829                  size_t socklen, const struct sockaddr *sa,
1830                  const char *name) {
1831   int fd;
1832   struct listener *l = xmalloc(sizeof *l);
1833   static const int one = 1;
1834
1835   D(("server_init socket %s", name));
1836   fd = xsocket(pf, SOCK_STREAM, 0);
1837   xsetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
1838   if(bind(fd, sa, socklen) < 0) {
1839     error(errno, "error binding to %s", name);
1840     return -1;
1841   }
1842   xlisten(fd, 128);
1843   nonblock(fd);
1844   cloexec(fd);
1845   l->name = name;
1846   l->pf = pf;
1847   if(ev_listen(ev, fd, listen_callback, l, "server listener"))
1848     exit(EXIT_FAILURE);
1849   return fd;
1850 }
1851
1852 int server_stop(ev_source *ev, int fd) {
1853   xclose(fd);
1854   return ev_listen_cancel(ev, fd);
1855 }
1856
1857 /*
1858 Local Variables:
1859 c-basic-offset:2
1860 comment-column:40
1861 fill-column:79
1862 End:
1863 */