chiark / gitweb /
user-* event log messages for benefit of admin users. Still need a
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 15 Jun 2008 12:08:16 +0000 (13:08 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sun, 15 Jun 2008 12:08:16 +0000 (13:08 +0100)
message telling a user their own rights have changed.

disobedience/log.c
doc/disorder_protocol.5.in
lib/eclient.c
lib/eclient.h
lib/trackdb.c
server/server.c

index affa449542aec6172ed702dce675071ed3061e7c..4dadae73aa8b1f5fa177f95524eb8cfae7457987 100644 (file)
@@ -45,19 +45,19 @@ static void log_rescanned(void *v);
 
 /** @brief Callbacks for server state monitoring */
 const disorder_eclient_log_callbacks log_callbacks = {
 
 /** @brief Callbacks for server state monitoring */
 const disorder_eclient_log_callbacks log_callbacks = {
-  log_connected,
-  log_completed,
-  log_failed,
-  log_moved,
-  log_playing,
-  log_queue,
-  log_recent_added,
-  log_recent_removed,
-  log_removed,
-  log_scratched,
-  log_state,
-  log_volume,
-  log_rescanned
+  .connected = log_connected,
+  .completed = log_completed,
+  .failed = log_failed,
+  .moved = log_moved,
+  .playing = log_playing,
+  .queue = log_queue,
+  .recent_added = log_recent_added,
+  .recent_removed = log_recent_removed,
+  .removed = log_removed,
+  .scratched = log_scratched,
+  .state = log_state,
+  .volume = log_volume,
+  .rescanned = log_rescanned
 };
 
 /** @brief Update everything */
 };
 
 /** @brief Update everything */
index f4c5b2fbfd446c744c484383229d0ef1f5f0aa71..367a68ab803a0128685c19abb11e92273a591bf4 100644 (file)
@@ -626,6 +626,18 @@ The current track was scratched.
 To simplify client implementation, \fBstate\fR commands reflecting the current
 state are sent at the start of the log.
 .RE
 To simplify client implementation, \fBstate\fR commands reflecting the current
 state are sent at the start of the log.
 .RE
+.TB
+.B user-add \fIUSERNAME\fR
+A user was created.
+.TP
+.B user-delete \fIUSERNAME\fR
+A user was deleted.
+.TP
+.B user-edit \fIUSERNAME\fR \fIPROPERTY\fR
+Some property of a user was edited.
+.TP
+.B user-confirm \fIUSERNAME\fR
+A user's login was confirmed (via the web interface).
 .TP
 .B volume \fILEFT\fR \fIRIGHT\fR
 The volume changed.
 .TP
 .B volume \fILEFT\fR \fIRIGHT\fR
 The volume changed.
@@ -634,6 +646,9 @@ The volume changed.
 is as defined in
 .B "TRACK INFORMATION"
 above.
 is as defined in
 .B "TRACK INFORMATION"
 above.
+.PP
+The \fBuser-*\fR messages are only sent to admin users, and are not sent over
+non-local connections unless \fBremote_userman\fR is enabled.
 .SH "CHARACTER ENCODING"
 All data sent by both server and client is encoded using UTF-8.
 Moreover it must be valid UTF-8, i.e. non-minimal sequences are not
 .SH "CHARACTER ENCODING"
 All data sent by both server and client is encoded using UTF-8.
 Moreover it must be valid UTF-8, i.e. non-minimal sequences are not
index 69069f5a7d0683420db2f597a2025999412321e3..e7395f35456f7a4ec3bdade11e06ef6792226df6 100644 (file)
@@ -180,6 +180,10 @@ static void logentry_scratched(disorder_eclient *c, int nvec, char **vec);
 static void logentry_state(disorder_eclient *c, int nvec, char **vec);
 static void logentry_volume(disorder_eclient *c, int nvec, char **vec);
 static void logentry_rescanned(disorder_eclient *c, int nvec, char **vec);
 static void logentry_state(disorder_eclient *c, int nvec, char **vec);
 static void logentry_volume(disorder_eclient *c, int nvec, char **vec);
 static void logentry_rescanned(disorder_eclient *c, int nvec, char **vec);
+static void logentry_user_add(disorder_eclient *c, int nvec, char **vec);
+static void logentry_user_confirm(disorder_eclient *c, int nvec, char **vec);
+static void logentry_user_delete(disorder_eclient *c, int nvec, char **vec);
+static void logentry_user_edit(disorder_eclient *c, int nvec, char **vec);
 
 /* Tables ********************************************************************/
 
 
 /* Tables ********************************************************************/
 
@@ -207,6 +211,10 @@ static const struct logentry_handler logentry_handlers[] = {
   LE(rescanned, 0, 0),
   LE(scratched, 2, 2),
   LE(state, 1, 1),
   LE(rescanned, 0, 0),
   LE(scratched, 2, 2),
   LE(state, 1, 1),
+  LE(user_add, 1, 1),
+  LE(user_confirm, 1, 1),
+  LE(user_delete, 1, 1),
+  LE(user_edit, 2, 2),
   LE(volume, 2, 2)
 };
 
   LE(volume, 2, 2)
 };
 
@@ -1531,6 +1539,30 @@ static void logentry_scratched(disorder_eclient *c,
     c->log_callbacks->state(c->log_v, c->statebits | DISORDER_CONNECTED);
 }
 
     c->log_callbacks->state(c->log_v, c->statebits | DISORDER_CONNECTED);
 }
 
+static void logentry_user_add(disorder_eclient *c,
+                              int attribute((unused)) nvec, char **vec) {
+  if(c->log_callbacks->user_add)
+    c->log_callbacks->user_add(c->log_v, vec[0]);
+}
+
+static void logentry_user_confirm(disorder_eclient *c,
+                              int attribute((unused)) nvec, char **vec) {
+  if(c->log_callbacks->user_confirm)
+    c->log_callbacks->user_confirm(c->log_v, vec[0]);
+}
+
+static void logentry_user_delete(disorder_eclient *c,
+                              int attribute((unused)) nvec, char **vec) {
+  if(c->log_callbacks->user_delete)
+    c->log_callbacks->user_delete(c->log_v, vec[0]);
+}
+
+static void logentry_user_edit(disorder_eclient *c,
+                              int attribute((unused)) nvec, char **vec) {
+  if(c->log_callbacks->user_edit)
+    c->log_callbacks->user_edit(c->log_v, vec[0], vec[1]);
+}
+
 static const struct {
   unsigned long bit;
   const char *enable;
 static const struct {
   unsigned long bit;
   const char *enable;
index 86caf7589c681b56fbd9b34e0b1886d0d3d9ec58..1d1b301428340f28943d62db8e93cc6ea4b66399 100644 (file)
@@ -93,19 +93,75 @@ typedef struct disorder_eclient_callbacks {
 typedef struct disorder_eclient_log_callbacks {
   /** @brief Called on (re-)connection */
   void (*connected)(void *v);
 typedef struct disorder_eclient_log_callbacks {
   /** @brief Called on (re-)connection */
   void (*connected)(void *v);
-  
+
+  /** @brief Called when @p track finished playing successfully */
   void (*completed)(void *v, const char *track);
   void (*completed)(void *v, const char *track);
+
+  /** @brief Called when @p track fails for some reason */
   void (*failed)(void *v, const char *track, const char *status);
   void (*failed)(void *v, const char *track, const char *status);
+
+  /** @brief Called when @p user moves some track or tracks in the queue
+   *
+   * Fetch the queue again to find out what the new order is - the
+   * rearrangement could in principle be arbitrarily complicated.
+   */
   void (*moved)(void *v, const char *user);
   void (*moved)(void *v, const char *user);
+
+  /** @brief Called when @p track starts playing
+   *
+   * @p user might be 0.
+   */
   void (*playing)(void *v, const char *track, const char *user/*maybe 0*/);
   void (*playing)(void *v, const char *track, const char *user/*maybe 0*/);
+
+  /** @brief Called when @p q is added to the queue
+   *
+   * Fetch the queue again to find out where the in the queue it was added.
+   */   
   void (*queue)(void *v, struct queue_entry *q);
   void (*queue)(void *v, struct queue_entry *q);
+
+  /** @brief Called when @p q is added to the recent list */
   void (*recent_added)(void *v, struct queue_entry *q);
   void (*recent_added)(void *v, struct queue_entry *q);
+
+  /** @brief Called when @p id is removed from the recent list */
   void (*recent_removed)(void *v, const char *id);
   void (*recent_removed)(void *v, const char *id);
+
+  /** @brief Called when @id is removed from the queue
+   *
+   * @p user might be 0.
+   */
   void (*removed)(void *v, const char *id, const char *user/*maybe 0*/);
   void (*removed)(void *v, const char *id, const char *user/*maybe 0*/);
+
+  /** @brief Called when @p track is scratched */
   void (*scratched)(void *v, const char *track, const char *user);
   void (*scratched)(void *v, const char *track, const char *user);
+
+  /** @brief Called with the current state whenever it changes
+   *
+   * State bits are:
+   * - @ref DISORDER_PLAYING_ENABLED
+   * - @ref DISORDER_RANDOM_ENABLED
+   * - @ref DISORDER_TRACK_PAUSED
+   * - @ref DISORDER_PLAYING
+   * - @ref DISORDER_CONNECTED
+   */
   void (*state)(void *v, unsigned long state);
   void (*state)(void *v, unsigned long state);
+
+  /** @brief Called when the volume changes */
   void (*volume)(void *v, int left, int right);
   void (*volume)(void *v, int left, int right);
+
+  /** @brief Called when a rescan completes */
   void (*rescanned)(void *v);
   void (*rescanned)(void *v);
+
+  /** @brief Called when a user is created (admins only) */
+  void (*user_add)(void *v, const char *user);
+
+  /** @brief Called when a user is confirmed (admins only) */
+  void (*user_confirm)(void *v, const char *user);
+
+  /** @brief Called when a user is deleted (admins only) */
+  void (*user_delete)(void *v, const char *user);
+
+  /** @brief Called when a user is edited (admins only) */
+  void (*user_edit)(void *v, const char *user, const char *property);
 } disorder_eclient_log_callbacks;
 
 /* State bits */
 } disorder_eclient_log_callbacks;
 
 /* State bits */
index 9f33a0ffe8f414eb038c1c4a4fba14ca58650b50..0b10d72413a86ff6ea89c412545794b640e967e0 100644 (file)
@@ -2681,6 +2681,7 @@ int trackdb_adduser(const char *user,
            user, rights, email);
     else
       info("created user '%s' with rights '%s'", user, rights);
            user, rights, email);
     else
       info("created user '%s' with rights '%s'", user, rights);
+    eventlog("user-add", user, (char *)0);
     return 0;
   }
 }
     return 0;
   }
 }
@@ -2698,6 +2699,7 @@ int trackdb_deluser(const char *user) {
     return -1;
   }
   info("deleted user '%s'", user);
     return -1;
   }
   info("deleted user '%s'", user);
+  eventlog("user-delete", user, (char *)0);
   return 0;
 }
 
   return 0;
 }
 
@@ -2777,8 +2779,10 @@ int trackdb_edituserinfo(const char *user,
   if(e) {
     error(0, "unknown user '%s'", user);
     return -1;
   if(e) {
     error(0, "unknown user '%s'", user);
     return -1;
-  } else
+  } else {
+    eventlog("user-edit", user, key, (char *)0);
     return 0;
     return 0;
+  }
 }
 
 /** @brief List all users
 }
 
 /** @brief List all users
@@ -2844,6 +2848,7 @@ int trackdb_confirm(const char *user, const char *confirmation,
   switch(e) {
   case 0:
     info("registration confirmed for user '%s'", user);
   switch(e) {
   case 0:
     info("registration confirmed for user '%s'", user);
+    eventlog("user-confirm", user, (char *)0);
     return 0;
   case DB_NOTFOUND:
     error(0, "confirmation for nonexistent user '%s'", user);
     return 0;
   case DB_NOTFOUND:
     error(0, "confirmation for nonexistent user '%s'", user);
index 6cfed04f2c30b37e5716cbf2dfe37dc8924e12bb..46647b10aabb567e7d6224d4725f384aa232f940 100644 (file)
@@ -878,6 +878,16 @@ static void logclient(const char *msg, void *user) {
     eventlog_remove(c->lo);
     return;
   }
     eventlog_remove(c->lo);
     return;
   }
+  /* user-* messages are restricted */
+  if(!strncmp(msg, "user-", 5)) {
+    /* They are only sent to admin users */
+    if(!(c->rights & RIGHT_ADMIN))
+      return;
+    /* They are not sent over TCP connections unless remote user-management is
+     * enabled */
+    if(!config->remote_userman && !(c->rights & RIGHT__LOCAL))
+      return;
+  }
   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" %s\n",
              (uintmax_t)time(0), msg);
 }
   sink_printf(ev_writer_sink(c->w), "%"PRIxMAX" %s\n",
              (uintmax_t)time(0), msg);
 }