chiark / gitweb /
add "users" command
[disorder] / server / server.c
index 145bfe222f9c277de23ee84e51a3e80833cfc1be..6392e89f4def0d0a4cfe6698fc66e300f077bbca 100644 (file)
@@ -51,6 +51,7 @@
 #include "split.h"
 #include "configuration.h"
 #include "hex.h"
+#include "rights.h"
 #include "trackdb.h"
 #include "table.h"
 #include "kvp.h"
@@ -911,7 +912,6 @@ static int c_tags(struct conn *c,
   }
   sink_writes(ev_writer_sink(c->w), ".\n");
   return 1;                            /* completed */
-
 }
 
 static int c_set_global(struct conn *c,
@@ -1050,19 +1050,61 @@ static int c_deluser(struct conn *c,
 }
 
 static int c_edituser(struct conn *c,
-                     char attribute((unused)) **vec,
+                     char **vec,
                      int attribute((unused)) nvec) {
-  sink_writes(ev_writer_sink(c->w), "550 Not implemented\n"); /* TODO */
+  /* TODO local only */
+  if(trusted(c)
+     || (!strcmp(c->who, vec[0])
+        && (!strcmp(vec[1], "email")
+            || !strcmp(vec[1], "password")))) {
+    if(trackdb_edituserinfo(vec[0], vec[1], vec[2]))
+      sink_writes(ev_writer_sink(c->w), "550 Failed to change setting\n");
+    else
+      sink_writes(ev_writer_sink(c->w), "250 OK\n");
+  } else
+    sink_writes(ev_writer_sink(c->w), "550 Restricted to administrators\n");
   return 1;
 }
 
 static int c_userinfo(struct conn *c,
                      char attribute((unused)) **vec,
                      int attribute((unused)) nvec) {
-  sink_writes(ev_writer_sink(c->w), "550 Not implemented\n"); /* TODO */
+  struct kvp *k;
+  const char *value;
+  
+  /* TODO local only */
+  if(trusted(c)
+     || (!strcmp(c->who, vec[0])
+        && (!strcmp(vec[1], "email")
+            || !strcmp(vec[1], "rights")))) {
+    if((k = trackdb_getuserinfo(vec[0])))
+      if((value = kvp_get(k, vec[1])))
+       sink_printf(ev_writer_sink(c->w), "252 %s\n", quoteutf8(value));
+      else
+       sink_writes(ev_writer_sink(c->w), "555 Not set\n");
+    else
+      sink_writes(ev_writer_sink(c->w), "550 No such user\n");
+  } else
+    sink_writes(ev_writer_sink(c->w), "550 Restricted to administrators\n");
   return 1;
 }
 
+static int c_users(struct conn *c,
+                  char attribute((unused)) **vec,
+                  int attribute((unused)) nvec) {
+  /* TODO de-dupe with c_tags */
+  char **users = trackdb_listusers();
+
+  sink_writes(ev_writer_sink(c->w), "253 User list follows\n");
+  while(*users) {
+    sink_printf(ev_writer_sink(c->w), "%s%s\n",
+               **users == '.' ? "." : "", *users);
+    ++users;
+  }
+  sink_writes(ev_writer_sink(c->w), ".\n");
+  return 1;                            /* completed */
+}
+
 #define C_AUTH         0001            /* must be authenticated */
 #define C_TRUSTED      0002            /* must be trusted user */
 
@@ -1121,6 +1163,7 @@ static const struct command {
   { "unset-global",   1, 1,       c_set_global,     C_AUTH },
   { "user",           2, 2,       c_user,           0 },
   { "userinfo",       2, 2,       c_userinfo,       C_AUTH },
+  { "users",          0, 0,       c_users,          C_AUTH },
   { "version",        0, 0,       c_version,        C_AUTH },
   { "volume",         0, 2,       c_volume,         C_AUTH }
 };