]> jfr.im git - irc/quakenet/newserv.git/blobdiff - noperserv/noperserv_fakeuser.c
CHANSERV: cleanup of accounts is now 180 days
[irc/quakenet/newserv.git] / noperserv / noperserv_fakeuser.c
index 77776f81082870ccb4bc4c2b737c28b212f9d52f..5bd11a729a0b7da786fe294e602d00e3e965299f 100644 (file)
 #include "../lib/irc_string.h"
 #include "../control/control.h"
 #include "../channel/channel.h"
-#include "../pqsql/pqsql.h"
+#include "../dbapi/dbapi.h"
 #include "../lib/strlfunc.h"
+#include "../lib/version.h"
 #include <string.h>
 #include <stdlib.h>
-#include <libpq-fe.h>
+
+MODULE_VERSION("");
 
 /* #define SIT_CHANNEL "#qnet.fakeusers" */
 #define KILL_WAIT 10
@@ -46,7 +48,7 @@ int killedusercount = 0;
 
 void fakeuser_cleanup();
 int fakeuser_loaddb();
-void fakeusers_load(PGconn *dbconn, void *tag);
+void fakeusers_load(DBConn *dbconn, void *tag);
 void fakeuser_handler(nick *user, int command, void **params);
 int fakeadd(void *sender, int cargc, char **cargv);
 int fakelist(void *sender, int cargc, char **cargv);
@@ -56,7 +58,7 @@ void reconnectfake(void *details);
 void _init() {
   if (!fakeuser_loaddb())
   {
-    Error("noperserv_fakeuser", ERR_ERROR, "Cannot load database");
+    Error("noperserv_fakeuser", ERR_FATAL, "Cannot load database");
     return;
   }
   registercontrolhelpcmd("fakeuser", NO_OPER, 4, &fakeadd, "Usage: FAKEUSER nick <ident> <host> <realname>\nCreates a fake user.");
@@ -89,49 +91,49 @@ void fakeuser_cleanup()
     free(killed);
   }
   fakeusercount = 0;
+  killedusercount = 0;
   fakeuserlist = NULL;
   killeduserlist = NULL;
 }
 
 int fakeuser_loaddb()
+// Called from _init
 {
-  if (!pqconnected())
+  if (!dbconnected())
     return 0;
   fakeuser_cleanup();
-  pqcreatequery("CREATE TABLE noperserv.fakeusers ("
+  dbcreatequery("CREATE TABLE noperserv.fakeusers ("
     "nick      VARCHAR(%d)  NOT NULL,"
     "ident     VARCHAR(%d)  NOT NULL,"
     "host      VARCHAR(%d)  NOT NULL,"
     "realname  VARCHAR(%d)  NOT NULL,"
     "PRIMARY KEY (nick))", NICKLEN, USERLEN, HOSTLEN, REALLEN);
-  pqasyncquery(&fakeusers_load, NULL, "SELECT nick, ident, host, realname FROM noperserv.fakeusers");
+  dbasyncquery(&fakeusers_load, NULL, "SELECT nick, ident, host, realname FROM noperserv.fakeusers");
   return 1;
 }
 
-void fakeusers_load(PGconn *dbconn, void *tag)
+void fakeusers_load(DBConn *dbconn, void *tag)
+// Called automatically when the async database query finishes
 {
-  PGresult *pgres = PQgetResult(dbconn);
+  DBResult *pgres = dbgetresult(dbconn);
   user_details details;
-  int i, rowcount;
 
-  if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
-    Error("noperserv_fakeuser", ERR_ERROR, "Error loading fakeuser list (%d)", PQresultStatus(pgres));
+  if (!dbquerysuccessful(pgres)) {
+    Error("noperserv_fakeuser", ERR_FATAL, "Error loading fakeuser list.");
+    dbclear(pgres);
     return;
   }
-  details.schedule = NULL;
-  rowcount = PQntuples(pgres);
-  Error("noperserv_fakeuser", ERR_INFO, "Loading %d users", rowcount);
 
   details.lastkill = 0;
-
-  for (i = 0; i < rowcount; i++)
-  {
-    strlcpy(details.nick, PQgetvalue(pgres, i, 0), NICKLEN + 1);
-    strlcpy(details.ident, PQgetvalue(pgres, i, 1), USERLEN + 1);
-    strlcpy(details.host, PQgetvalue(pgres, i, 2), HOSTLEN + 1);
-    strlcpy(details.realname, PQgetvalue(pgres, i, 3), REALLEN + 1);
+  details.schedule = NULL;
+  while(dbfetchrow(pgres)) {
+    strlcpy(details.nick, dbgetvalue(pgres, 0), NICKLEN + 1);
+    strlcpy(details.ident, dbgetvalue(pgres, 1), USERLEN + 1);
+    strlcpy(details.host, dbgetvalue(pgres, 2), HOSTLEN + 1);
+    strlcpy(details.realname, dbgetvalue(pgres, 3), REALLEN + 1);
     reconnectfake(&details);
   }
+  dbclear(pgres);
 }
 
 user_details *getdetails(nick *user)
@@ -140,11 +142,11 @@ user_details *getdetails(nick *user)
   details = malloc(sizeof(user_details));
   if (!details)
     return NULL;
-  details->schedule = NULL;
   strlcpy(details->nick, user->nick, NICKLEN + 1);
   strlcpy(details->ident, user->ident, USERLEN + 1);
   strlcpy(details->host, user->host->name->content, HOSTLEN + 1);
   strlcpy(details->realname, user->realname->name->content, REALLEN + 1);
+  details->schedule = NULL;
   details->lastkill = 0;
   return details;
 }
@@ -157,7 +159,7 @@ int err_code;
 nick *register_fakeuser(user_details *details)
 {
   nick *user;
-  if((user = getnickbynick(details->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) {
+  if ((user = getnickbynick(details->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) {
     err_code = ERR_WONTKILL;
     return NULL;
   }
@@ -167,7 +169,8 @@ nick *register_fakeuser(user_details *details)
     NULL, UMODE_INV | UMODE_DEAF, &fakeuser_handler);
 }
 
-fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
+fakeuser *ll_add(user_details *details) 
+// Adds to the (sorted) linked list
 {
   fakeuser *fake, *newfake;
   int cmp;
@@ -191,13 +194,11 @@ fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
       err_code = ERR_MEM;
       return NULL;
     }
-
     newfake->user = register_fakeuser(details);
     if (!newfake->user)
     {
       free(newfake);
-      /* errcode already set by register_fakeuser */
-      return NULL;
+      return NULL;   //errcode already set by register_fakeuser
     }
     newfake->lastkill = details->lastkill;
     newfake->next = fakeuserlist;
@@ -225,8 +226,7 @@ fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
       if (!newfake->user)
       {
         free(newfake);
-        /* errcode already set by register_fakeuser */
-        return NULL;
+        return NULL;   //errcode already set by register_fakeuser
       }
       newfake->lastkill = details->lastkill;
       newfake->next = fake->next;
@@ -245,8 +245,7 @@ fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
   if (!newfake->user)
   {
     free(newfake);
-    /* errcode already set by register_fakeuser */
-    return NULL;
+    return NULL;   //errcode already set by register_fakeuser
   }
   newfake->lastkill = details->lastkill;
   newfake->next = NULL;
@@ -255,7 +254,8 @@ fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
   return newfake;
 }
 
-void kll_add(user_details *details) //Adds to the (sorted) linked list of killed users
+void kll_add(user_details *details)
+//Adds to the (sorted) linked list of killed users
 {
   int cmp;
   user_details *killed;
@@ -288,7 +288,8 @@ void kll_add(user_details *details) //Adds to the (sorted) linked list of killed
   return;
 }
 
-fakeuser *ll_remove(char *nickname) //Removes from the linked list
+fakeuser *ll_remove(char *nickname)
+//Removes from the linked list
 {
   fakeuser *fake, *rmfake;
   int cmp;
@@ -368,20 +369,21 @@ void fakeuser_handler(nick *user, int command, void **params)
 
     details = getdetails(user);
     item = ll_remove(details->nick);
-    if(!item)
+    if (!item)
+    {
+      controlwall(NO_OPER, NL_FAKEUSERS, "Error: A fakeuser was killed, but wasn't found in the list");
+      Error("noperserv_fakeuser", ERR_ERROR, "A fakeuser was killed, but wasn't found in the list");
       return;
+    }
 
     details->lastkill = item->lastkill;
     free(item);
 
-    if(timenow - item->lastkill < KILL_TIME) {
+    if (timenow - details->lastkill < KILL_TIME) {
       char escnick[NICKLEN * 2 + 1];
       controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.", details->nick, details->ident, details->host, details->realname, KILL_TIME);
-      item = ll_remove(details->nick);
-      free(item);
-
-      PQescapeString(escnick, details->nick, strlen(details->nick));
-      pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+      dbescapestring(escnick, details->nick, strlen(details->nick));
+      dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
       return;
     }
     details->lastkill = timenow;
@@ -436,27 +438,33 @@ int fakeadd(void *sender, int cargc, char **cargv)
     if (err_code == ERR_EXISTS)
       controlreply(sender, "Error: fakeuser already exists");
     else if (err_code == ERR_MEM)
+    {
       controlreply(sender, "Error: memory error!!");
+      Error("noperserv_fakeuser", ERR_STOP, "malloc error");
+    }
     else if (err_code == ERR_WONTKILL)
       controlreply(sender, "Nick already exists and I won't kill it");
     else
+    {
       controlreply(sender, "Unknown error when adding fakeuser");
+      Error("noperserv_fakeuser", ERR_ERROR, "Unknown error when adding fakeuser");
+    }
     return CMD_ERROR;
   }
   newnick = newfake->user;
-  PQescapeString(escnick, newnick->nick, strlen(newnick->nick));
-  PQescapeString(escident, newnick->ident, strlen(newnick->ident));
-  PQescapeString(eschost, newnick->host->name->content, newnick->host->name->length);
-  PQescapeString(escreal, newnick->realname->name->content, newnick->realname->name->length);  
+  dbescapestring(escnick, newnick->nick, strlen(newnick->nick));
+  dbescapestring(escident, newnick->ident, strlen(newnick->ident));
+  dbescapestring(eschost, newnick->host->name->content, newnick->host->name->length);
+  dbescapestring(escreal, newnick->realname->name->content, newnick->realname->name->length);  
   if ((killed = kll_remove(newnick->nick)))  //Is this nickname scheduled to reconnect?
   {
     deleteschedule(killed->schedule, &reconnectfake, killed);
     free(killed);
-    pqquery("UPDATE noperserv.fakeusers SET ident = '%s', host = '%s', realname = '%s' WHERE nick = '%s'", 
+    dbquery("UPDATE noperserv.fakeusers SET ident = '%s', host = '%s', realname = '%s' WHERE nick = '%s'", 
              escident, eschost, escreal, escnick);
   }
   else
-    pqquery("INSERT INTO noperserv.fakeusers (nick, ident, host, realname) VALUES ('%s', '%s', '%s', '%s')",
+    dbquery("INSERT INTO noperserv.fakeusers (nick, ident, host, realname) VALUES ('%s', '%s', '%s', '%s')",
             escnick, escident, eschost, escreal);
   controlreply(sender, "Added fake user %s", newnick->nick);
   controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) added by %s/%s", newnick->nick, newnick->ident,
@@ -506,8 +514,8 @@ int fakekill(void *sender, int cargc, char **cargv)
     return CMD_USAGE;
   if ((fake = ll_remove(cargv[0])))
   {
-    PQescapeString(escnick, fake->user->nick, strlen(fake->user->nick));
-    pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+    dbescapestring(escnick, fake->user->nick, strlen(fake->user->nick));
+    dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
     controlreply(sender, "Killed fake user %s", fake->user->nick);
     controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) removed by %s/%s", fake->user->nick, fake->user->ident,
                 fake->user->host->name->content, fake->user->realname->name->content, ((nick*)sender)->nick, ((nick*)sender)->authname);
@@ -520,8 +528,8 @@ int fakekill(void *sender, int cargc, char **cargv)
   }
   if ((k_fake = kll_remove(cargv[0])))  //Fakeuser might be waiting to rejoin
   {
-    PQescapeString(escnick, k_fake->nick, strlen(k_fake->nick));
-    pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+    dbescapestring(escnick, k_fake->nick, strlen(k_fake->nick));
+    dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
     controlreply(sender, "Killed fake user %s", k_fake->nick);
     controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) removed by %s/%s", k_fake->nick,
                 k_fake->ident, k_fake->host, k_fake->realname, ((nick*)sender)->nick, ((nick*)sender)->authname);
@@ -533,6 +541,7 @@ int fakekill(void *sender, int cargc, char **cargv)
 }
 
 void reconnectfake(void *details)
+//Called after the timeout period has expired since a fakeuser was killed, or on load
 {
   fakeuser *fake;
   user_details *u_details = details;