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