]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Implement the trust log.
authorGunnar Beutner <redacted>
Fri, 14 Jun 2013 17:12:03 +0000 (19:12 +0200)
committerGunnar Beutner <redacted>
Fri, 14 Jun 2013 17:12:03 +0000 (19:12 +0200)
--HG--
branch : shroudtrusts

trusts/trusts.h
trusts/trusts_commands.c
trusts/trusts_db.c
trusts/trusts_management.c

index fbec7025cb334cc2b59260c6ea9dd0f46c325a63..284163a5ae199f3cf2f44f6ae5e6824714a9da96 100644 (file)
@@ -14,6 +14,7 @@
 #define TRUSTNAMELEN 100
 #define TRUSTHOSTLEN 100
 #define CREATEDBYLEN NICKLEN + 1
+#define TRUSTLOGLEN 200
 
 #define MAXTGEXTS 5
 
@@ -133,6 +134,9 @@ trusthost *th_copy(trusthost *);
 void tg_update(trustgroup *);
 void tg_delete(trustgroup *);
 void th_delete(trusthost *);
+void trustlog(unsigned int groupid, const char *user, const char *format, ...);
+void trustlogspew(nick *np, unsigned int groupid, unsigned int limit);
+void trustloggrep(nick *np, const char *pattern, unsigned int limit);
 
 typedef struct trustmigration {
   int count, cur;
index b6f2db6e08f9f6fbf1a3343dbfd2443de0170885..0ce5e7e76f202a490fc51a3699dd3ad6b29750fe 100644 (file)
@@ -264,7 +264,7 @@ static void registercommands(int hooknum, void *arg) {
     return;
   commandsregistered = 1;
 
-  registercontrolhelpcmd("trustlist", NO_OPER, 1, trusts_cmdtrustlist, "Usage: trustlist <#id|name|id>\nShows trust data for the specified trust group.");
+  registercontrolhelpcmd("trustlist", NO_OPER, 1, trusts_cmdtrustlist, "Usage: trustlist <#id|name|IP>\nShows trust data for the specified trust group.");
   registercontrolhelpcmd("trustdump", NO_OPER, 2, trusts_cmdtrustdump, "Usage: trustdump <#id> <number>");
 }
 
index 7f6b63d866060a84283773b947270470fa7a62ae..0fec8eb25d4399fa1b900bb878f06c6c33b52e1a 100644 (file)
@@ -1,7 +1,10 @@
+#include <stdio.h>
+#include <stdarg.h>
 #include "../dbapi2/dbapi2.h"
 #include "../core/error.h"
 #include "../core/hooks.h"
 #include "../core/schedule.h"
+#include "../control/control.h"
 #include "trusts.h"
 
 DBAPIConn *trustsdb;
@@ -36,6 +39,11 @@ void createtrusttables(int mode) {
 
   /* I'd like multiple keys here but that's not gonna happen on a cross-database platform :( */
   trustsdb->createtable(trustsdb, NULL, NULL, "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, host VARCHAR(?), maxusage INT, lastseen INT)", "Td", hosts, TRUSTHOSTLEN);
+
+  trustsdb->createtable(trustsdb, NULL, NULL,
+    "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, ts INT, username VARCHAR(?), message VARCHAR(?))",
+    "Tdd", "log", CREATEDBYLEN, TRUSTLOGLEN
+  );
 }
 
 static void flushdatabase(void *arg) {
@@ -369,6 +377,66 @@ void th_delete(trusthost *th) {
   th_linktree();
 }
 
+void trustlog(unsigned int groupid, const char *user, const char *format, ...) {
+  char buf[TRUSTLOGLEN+1];
+  va_list va;
+  unsigned int now;
+
+  va_start(va, format);
+  vsnprintf(buf, sizeof(buf), format, va);
+  va_end(va);
+
+  now = time(NULL);
+
+  trustsdb->squery(trustsdb,
+    "INSERT INTO ? (ts, groupid, username, message) VALUES (?, ?, ?, ?)",
+    "Tuuss", "log", now, groupid, user, buf);
+}
+
+static void trustlogquery_callback(const struct DBAPIResult *result, void *arg) {
+  nick *np = (nick *)arg;
+  int rows = 0;
+
+  if(!result || !result->success) {
+    controlreply(np, "Error querying the log.");
+
+    if(result)
+      result->clear(result);
+
+    return;
+  }
+
+  while(result->next(result)) {
+    unsigned int ts, groupid;
+    char *user, *message;
+
+    ts = strtoul(result->get(result, 0), NULL, 10);
+    groupid = strtoul(result->get(result, 1), NULL, 10);
+    user = result->get(result, 2);
+    message = result->get(result, 3);
+
+    controlreply(np, "[%s] #%d (%s) %s", trusts_timetostr(ts), groupid, user, message);
+    rows++;
+  }
+
+  controlreply(np, "--- Done. Found %d rows.", rows);
+}
+
+void trustlogspew(nick *np, unsigned int groupid, unsigned int limit) {
+  trustsdb->query(trustsdb, trustlogquery_callback, (void *)np,
+    "SELECT ts, groupid, username, message FROM ? WHERE groupid = ? ORDER BY ts DESC LIMIT ?",
+    "Tuu", "log", groupid, limit);
+}
+
+void trustloggrep(nick *np, const char *pattern, unsigned int limit) {
+  char buf[512];
+  snprintf(buf, sizeof(buf), "%%%s%%", pattern);
+
+  trustsdb->query(trustsdb, trustlogquery_callback, (void *)np,
+    "SELECT ts, groupid, username, message FROM ? WHERE message LIKE ? ORDER BY ts DESC LIMIT ?",
+    "Tsu", "log", buf, limit);
+}
+
 void _init(void) {
   trusts_connectdb();
 }
index cd487f465efb3895abd1e62a0845bf349489faf5..a24a9503ca3e5c1be41d345e4eb820182c52fe92 100644 (file)
@@ -85,6 +85,7 @@ static int trusts_cmdtrustadd(void *source, int cargc, char **cargv) {
   triggerhook(HOOK_TRUSTS_ADDHOST, th);
 
   controlwall(NO_OPER, NL_TRUSTS, "%s TRUSTADD'ed host %s to group '%s'", controlid(sender), host, th->group->name->content);
+  trustlog(tg->id, controlid(sender), "Added host '%s'.", host);
 
   return CMD_OK;
 }
@@ -175,6 +176,9 @@ static int trusts_cmdtrustgroupadd(void *source, int cargc, char **cargv) {
   triggerhook(HOOK_TRUSTS_ADDGROUP, tg);
 
   controlwall(NO_OPER, NL_TRUSTS, "%s TRUSTGROUPADD'ed '%s'", controlid(sender), tg->name->content);
+  trustlog(tg->id, controlid(sender), "Created trust group '%s' (ID #%d): howmany=%d, enforceident=%d, maxperident=%d, "
+    "expires=%d, createdby=%s, contact=%s, comment=%s",
+    tg->name->content, howmany, tg->id, enforceident, maxperident, howlong + time(NULL), createdby, contact, comment);
 
   return CMD_OK;
 }
@@ -198,6 +202,7 @@ static int trusts_cmdtrustgroupdel(void *source, int cargc, char **cargv) {
   }
 
   controlwall(NO_OPER, NL_TRUSTS, "%s TRUSTGROUPDEL'ed '%s'.", controlid(sender), tg->name->content);
+  trustlog(tg->id, controlid(sender), "Deleted group '%s'.", tg->name->content);
 
   triggerhook(HOOK_TRUSTS_DELGROUP, tg);
   tg_delete(tg);
@@ -242,6 +247,7 @@ static int trusts_cmdtrustdel(void *source, int cargc, char **cargv) {
   controlreply(sender, "Host deleted.");
 
   controlwall(NO_OPER, NL_TRUSTS, "%s TRUSTDEL'ed %s from group '%s'.", controlid(sender), host, tg->name->content);
+  trustlog(tg->id, controlid(sender), "Removed host '%s'.", host);
 
   return CMD_OK;
 }
@@ -361,10 +367,90 @@ static int trusts_cmdtrustgroupmodify(void *source, int cargc, char **cargv) {
   controlreply(sender, "Group modified.");
 
   controlwall(NO_OPER, NL_TRUSTS, "%s TRUSTMODIFIED'ed group '%s' (field: %s, value: %s)", controlid(sender), tg->name->content, what, to);
+  trustlog(tg->id, controlid(sender), "Modified %s: %s", what, to);
 
   return CMD_OK;
 }
 
+static int trusts_cmdtrustlogspew(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  trustgroup *tg = NULL;
+  char *name;
+  int groupid;
+  int limit = 0;
+
+  if(cargc < 1)
+    return CMD_USAGE;
+
+  name = cargv[0];
+
+  tg = tg_strtotg(name);
+
+  if(tg)
+    groupid = tg->id;
+  else if (name[0] == '#')
+    groupid = strtoul(name + 1, NULL, 10);
+  else {
+    controlreply(sender, "Invalid trust group name or ID.");
+    return CMD_OK;
+  }
+
+  if(cargc>1)
+    limit = strtoul(cargv[1], NULL, 10);
+
+  if(limit==0)
+    limit = 100;
+
+  trustlogspew(sender, groupid, limit);
+
+  return CMD_OK;
+}
+
+static int trusts_cmdtrustloggrep(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  char *pattern;
+  int limit = 0;
+
+  if(cargc < 1)
+    return CMD_USAGE;
+
+  pattern = cargv[0];
+
+  if(cargc>1)
+    limit = strtoul(cargv[1], NULL, 10);
+
+  if(limit==0)
+    limit = 100;
+
+  trustloggrep(sender, pattern, limit);
+
+  return CMD_OK;
+}
+
+static int trusts_cmdtrustcomment(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  trustgroup *tg = NULL;
+  char *name, *comment;
+
+  if(cargc < 2)
+    return CMD_USAGE;
+
+  name = cargv[0];
+  comment = cargv[1];
+
+  tg = tg_strtotg(name);
+
+  if(!tg) {
+    controlreply(sender, "Invalid trust group name or ID.");
+    return CMD_OK;
+  }
+
+  trustlog(tg->id, controlid(sender), "Comment: %s", comment);
+
+  return CMD_OK;
+}
+
+
 static int commandsregistered;
 
 static void registercommands(int hooknum, void *arg) {
@@ -377,6 +463,9 @@ static void registercommands(int hooknum, void *arg) {
   registercontrolhelpcmd("trustgroupdel", NO_OPER, 1, trusts_cmdtrustgroupdel, "Usage: trustgroupdel <#id|name|id>");
   registercontrolhelpcmd("trustdel", NO_OPER, 2, trusts_cmdtrustdel, "Usage: trustdel <#id|name|id> <ip/mask>");
   registercontrolhelpcmd("trustgroupmodify", NO_OPER, 3, trusts_cmdtrustgroupmodify, "Usage: trustgroupmodify <#id|name|id> <field> <new value>");
+  registercontrolhelpcmd("trustlogspew", NO_OPER, 2, trusts_cmdtrustlogspew, "Usage: trustlogspew <#id|name> [limit]\nShows log for the specified trust group.");
+  registercontrolhelpcmd("trustloggrep", NO_OPER, 2, trusts_cmdtrustloggrep, "Usage trustloggrep <pattern> [limit]\nShows maching log entries.");
+  registercontrolhelpcmd("trustcomment", NO_OPER, 2, trusts_cmdtrustcomment, "Usage: trustcomment <#id|name> <comment>\nLogs a comment for a trust.");
 }
 
 static void deregistercommands(int hooknum, void *arg) {
@@ -389,6 +478,9 @@ static void deregistercommands(int hooknum, void *arg) {
   deregistercontrolcmd("trustgroupdel", trusts_cmdtrustgroupdel);
   deregistercontrolcmd("trustdel", trusts_cmdtrustdel);
   deregistercontrolcmd("trustgroupmodify", trusts_cmdtrustgroupmodify);
+  deregistercontrolcmd("trustlogspew", trusts_cmdtrustlogspew);
+  deregistercontrolcmd("trustloggrep", trusts_cmdtrustloggrep);
+  deregistercontrolcmd("trustcomment", trusts_cmdtrustcomment);
 }
 
 static int loaded;