#include "split.h"
#include "configuration.h"
#include "hex.h"
+#include "rights.h"
#include "trackdb.h"
#include "table.h"
#include "kvp.h"
}
sink_writes(ev_writer_sink(c->w), ".\n");
return 1; /* completed */
-
}
static int c_set_global(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 */
{ "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 }
};