chiark / gitweb /
fill in some more gaps in the user database support
[disorder] / lib / client.c
index 97dde93825ddef6c019e32f5b6bfb6498cba747a..e4792db0853760a512b6c5832cced4b93b3723b9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2006 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include <stdlib.h>
+#include <pcre.h>
 
 #include "log.h"
 #include "mem.h"
@@ -49,6 +50,8 @@
 #include "addr.h"
 #include "authhash.h"
 #include "client-common.h"
+#include "rights.h"
+#include "trackdb.h"
 
 struct disorder_client {
   FILE *fpin, *fpout;
@@ -154,22 +157,24 @@ static int connect_sock(void *vc,
                        const char *ident) {
   const char *username, *password;
   disorder_client *c = vc;
-  int n;
   
   if(!(username = config->username)) {
     error(0, "no username configured");
     return -1;
   }
-  if(!(password = config->password)) {
-    for(n = 0; (n < config->allow.n
-               && strcmp(config->allow.s[n].s[0], username)); ++n)
-      ;
-    if(n < config->allow.n)
-      password = config->allow.s[n].s[1];
-    else {
-      error(0, "no password configured");
-      return -1;
-    }
+  password = config->password;
+  if(!password) {
+    /* Maybe we can read the database */
+    /* TODO failure to open the database should not be fatal */
+    trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
+    trackdb_open(TRACKDB_READ_ONLY);
+    password = trackdb_get_password(username);
+    trackdb_close();
+  }
+  if(!password) {
+    /* Oh well */
+    error(0, "no password configured");
+    return -1;
   }
   return disorder_connect_sock(c, sa, len, username, password, ident);
 }
@@ -207,11 +212,12 @@ int disorder_connect_sock(disorder_client *c,
                          const char *username,
                          const char *password,
                          const char *ident) {
-  int fd = -1, fd2 = -1;
+  int fd = -1, fd2 = -1, nrvec;
   unsigned char *nonce;
   size_t nl;
   const char *res;
-  char *r;
+  char *r, **rvec;
+  const char *algo = "SHA1";
 
   if(!password) {
     error(0, "no password found");
@@ -243,9 +249,17 @@ int disorder_connect_sock(disorder_client *c,
   c->ident = xstrdup(ident);
   if(disorder_simple(c, &r, 0, (const char *)0))
     return -1;
-  if(!(nonce = unhex(r, &nl)))
+  if(!(rvec = split(r, &nrvec, SPLIT_QUOTES, 0, 0)))
+    return -1;
+  if(nrvec > 1) {
+    algo = *rvec++;
+    --nrvec;
+  }
+  if(!nrvec)
+    return -1;
+  if(!(nonce = unhex(*rvec, &nl)))
     return -1;
-  if(!(res = authhash(nonce, nl, password))) goto error;
+  if(!(res = authhash(nonce, nl, password, algo))) goto error;
   if(disorder_simple(c, 0, "user", username, res, (char *)0))
     return -1;
   c->user = xstrdup(username);
@@ -591,6 +605,27 @@ int disorder_tags(disorder_client *c,
   return disorder_simple_list(c, vecp, nvecp, "tags", (char *)0);
 }
 
+int disorder_users(disorder_client *c,
+                  char ***vecp, int *nvecp) {
+  return disorder_simple_list(c, vecp, nvecp, "users", (char *)0);
+}
+
+/** @brief Get recentl added tracks
+ * @param c Client
+ * @param vecp Where to store pointer to list
+ * @param nvecp Where to store count
+ * @param max Maximum tracks to fetch, or 0 for all available
+ * @return 0 on success, non-0 on error
+ */
+int disorder_new_tracks(disorder_client *c,
+                       char ***vecp, int *nvecp,
+                       int max) {
+  char limit[32];
+
+  sprintf(limit, "%d", max);
+  return disorder_simple_list(c, vecp, nvecp, "new", limit, (char *)0);
+}
+
 int disorder_set_global(disorder_client *c,
                        const char *key, const char *value) {
   return disorder_simple(c, 0, "set-global", key, value, (char *)0);
@@ -604,6 +639,42 @@ int disorder_get_global(disorder_client *c, const char *key, char **valuep) {
   return disorder_simple(c, valuep, "get-global", key, (char *)0);
 }
 
+int disorder_rtp_address(disorder_client *c, char **addressp, char **portp) {
+  char *r;
+  int rc, n;
+  char **vec;
+
+  if((rc = disorder_simple(c, &r, "rtp-address", (char *)0)))
+    return rc;
+  vec = split(r, &n, SPLIT_QUOTES, 0, 0);
+  if(n != 2) {
+    error(0, "malformed rtp-address reply");
+    return -1;
+  }
+  *addressp = vec[0];
+  *portp = vec[1];
+  return 0;
+}
+
+int disorder_adduser(disorder_client *c,
+                    const char *user, const char *password) {
+  return disorder_simple(c, 0, "adduser", user, password, (char *)0);
+}
+
+int disorder_deluser(disorder_client *c, const char *user) {
+  return disorder_simple(c, 0, "deluser", user, (char *)0);
+}
+
+int disorder_userinfo(disorder_client *c, const char *user, const char *key,
+                     char **valuep) {
+  return disorder_simple(c, valuep, "userinfo", user, key, (char *)0);
+}
+
+int disorder_edituser(disorder_client *c, const char *user,
+                     const char *key, const char *value) {
+  return disorder_simple(c, 0, "edituser", user, key, value, (char *)0);
+}
+
 /*
 Local Variables:
 c-basic-offset:2