]> jfr.im git - irc/quakenet/newserv.git/blobdiff - trojanscan/trojanscan.c
Merge.
[irc/quakenet/newserv.git] / trojanscan / trojanscan.c
index efdb804d1ef1ad08e5f6a85ff81fb831a71e816c..816ec1d037102dd820640ec31df2a3f448cf9144 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Trojanscan version 2
  *
- * Trojanscan  copyright (C) Chris Porter 2002-2007
+ * Trojanscan  copyright (C) Chris Porter 2002-2009
  * Newserv bits copyright (C) David Mansell 2002-2003
  * 
  * TODO: CHECK::
@@ -15,6 +15,7 @@
 #include "../lib/strlfunc.h"
 #include "../lib/version.h"
 #include "../core/nsmalloc.h"
+#include <stdint.h>
 
 #define tmalloc(x)     nsmalloc(POOL_TROJANSCAN, x)
 #define tfree(x)       nsfree(POOL_TROJANSCAN, x)
@@ -129,6 +130,24 @@ void _fini(void) {
   for (i=0;i<trojanscan_tailpoolsize;i++)
     freesstring(trojanscan_tailpool[i]);
   trojanscan_database_close();
+
+  deletecommandfromtree(trojanscan_cmds, "showcommands", &trojanscan_showcommands);
+  deletecommandfromtree(trojanscan_cmds, "help", &trojanscan_help);
+  deletecommandfromtree(trojanscan_cmds, "hello", &trojanscan_hello);
+  deletecommandfromtree(trojanscan_cmds, "join", &trojanscan_userjoin);
+  deletecommandfromtree(trojanscan_cmds, "chanlist", &trojanscan_chanlist);
+  deletecommandfromtree(trojanscan_cmds, "whois", &trojanscan_whois);
+  deletecommandfromtree(trojanscan_cmds, "changelev", &trojanscan_changelev);
+  deletecommandfromtree(trojanscan_cmds, "deluser", &trojanscan_deluser);
+  deletecommandfromtree(trojanscan_cmds, "mew", &trojanscan_mew);
+  deletecommandfromtree(trojanscan_cmds, "status", &trojanscan_status);
+  deletecommandfromtree(trojanscan_cmds, "listusers", &trojanscan_listusers);
+  deletecommandfromtree(trojanscan_cmds, "rehash", &trojanscan_rehash);
+  deletecommandfromtree(trojanscan_cmds, "cat", &trojanscan_cat);
+  deletecommandfromtree(trojanscan_cmds, "reschedule", &trojanscan_reschedule);
+
+  destroycommandtree(trojanscan_cmds);
+  nscheckfreeall(POOL_TROJANSCAN);
 }
 
 static void trojanscan_connect_nick(void *arg) {
@@ -137,7 +156,7 @@ static void trojanscan_connect_nick(void *arg) {
 
   mnick = getcopyconfigitem("trojanscan", "nick", "T", NICKLEN);
   myident = getcopyconfigitem("trojanscan", "ident", "trojanscan", NICKLEN);
-  myhost = getcopyconfigitem("trojanscan", "hostname", "trojanscan.slug.netsplit.net", HOSTLEN);
+  myhost = getcopyconfigitem("trojanscan", "hostname", "trojanscan.quakenet.org", HOSTLEN);
   myrealname = getcopyconfigitem("trojanscan", "realname", "Trojanscan v" TROJANSCAN_VERSION, REALLEN);
   myauthname = getcopyconfigitem("trojanscan", "authname", "T", ACCOUNTLEN);
 
@@ -197,12 +216,12 @@ void trojanscan_connect(void *arg) {
   trojanscan_database.glines = 0;
   trojanscan_database.detections = 0;
     
-  dbhost = getcopyconfigitem("trojanscan", "dbhost", "localhost", HOSTLEN);
-  dbuser = getcopyconfigitem("trojanscan", "dbuser", "", NICKLEN);
-  dbpass = getcopyconfigitem("trojanscan", "dbpass", "", REALLEN);
-  db = getcopyconfigitem("trojanscan", "db", "", NICKLEN);
+  dbhost = getcopyconfigitem("trojanscan", "dbhost", "localhost", 100);
+  dbuser = getcopyconfigitem("trojanscan", "dbuser", "moo", 100);
+  dbpass = getcopyconfigitem("trojanscan", "dbpass", "changeme", 100);
+  db = getcopyconfigitem("trojanscan", "db", "moo", 100);
   
-  dbport = getcopyconfigitem("trojanscan", "dbport", "3306", ACCOUNTLEN);
+  dbport = getcopyconfigitem("trojanscan", "dbport", "3306", 10);
   
   length = snprintf(buf, sizeof(buf) - 1, "%d", TROJANSCAN_DEFAULT_MAXCHANS);
   temp = getcopyconfigitem("trojanscan", "maxchans", buf, length);
@@ -233,6 +252,11 @@ void trojanscan_connect(void *arg) {
 
   if ((trojanscan_cycletime / trojanscan_maxchans) < 1) {
     Error("trojanscan", ERR_FATAL, "Cycletime / maxchans < 1, increase cycletime or decrease maxchans else cycling breaks.");
+    freesstring(dbhost);
+    freesstring(dbuser);
+    freesstring(dbpass);
+    freesstring(db);
+    freesstring(dbport);
     return; /* PPA: module failed to load */
   }
   
@@ -245,6 +269,11 @@ void trojanscan_connect(void *arg) {
 
   if (trojanscan_database_connect(dbhost->content, dbuser->content, dbpass->content, db->content, atoi(dbport->content)) < 0) {
     Error("trojanscan", ERR_FATAL, "Cannot connect to database host!");
+    freesstring(dbhost);
+    freesstring(dbuser);
+    freesstring(dbpass);
+    freesstring(db);
+    freesstring(dbport);
     return; /* PPA: module failed to load */
   }
   
@@ -354,7 +383,9 @@ void trojanscan_free_database(void) {
   trojanscan_database.total_channels = 0;
   trojanscan_database.total_phrases = 0;
   trojanscan_database.total_worms = 0;
-  
+  trojanscan_database.channels = NULL;
+  trojanscan_database.phrases = NULL;
+  trojanscan_database.worms = NULL;  
 }
 
 char *trojanscan_sanitise(char *input) {
@@ -720,7 +751,7 @@ int trojanscan_whois(void *sender, int cargc, char **cargv) {
     for(i=0;i<TROJANSCAN_CLONE_TOTAL;i++) {
       if(trojanscan_swarm[i].clone->nick && !ircd_strcmp(trojanscan_swarm[i].clone->nick, np2->nick)) {
         trojanscan_reply(np, "Nickname   : %s", np2->nick);
-        trojanscan_reply(np, "Swarm      : yes", trojanscan_swarm[i].clone->nick);
+        trojanscan_reply(np, "Swarm      : yes");
         return CMD_OK;
       }
     }
@@ -1077,7 +1108,7 @@ int trojanscan_nickbanned(trojanscan_clones *np, channel *cp) {
 
   np->clone->ipnode = np->fakeipnode;
 
-  ret = nickbanned(np->clone, cp);
+  ret = nickbanned(np->clone, cp, 0);
 
   np->clone->ipnode = realipnode;
 
@@ -1977,16 +2008,14 @@ static int trojanscan_hostcount(nick *sender, int hostmode, char *mask, int mask
   nick *np = NULL; /* sigh at warnings */
 
   if(hostmode)
-    for (j=0;j<NICKHASHSIZE;j++)
-      for (np=nicktable[j];np;np=np->next)
-        if (np->ipnode==sender->ipnode)
-          usercount++;
+    usercount = sender->ipnode->usercount;
 
   if(usercount > TROJANSCAN_MAX_HOST_GLINE) {
     hostmode = 0;
     usercount = 0;
   }
 
+  /* should really go through the ipnode I guess */
   if(!hostmode)
     for (j=0;j<NICKHASHSIZE;j++)
       for (np=nicktable[j];np;np=np->next)
@@ -2060,9 +2089,9 @@ void trojanscan_phrasematch(channel *chp, nick *sender, trojanscan_phrases *phra
     trojanscan_database_query("INSERT INTO hits (nickname, ident, host, phrase, messagetype, glined) VALUES ('%s', '%s', '%s', %d, '%c', %d)", enick, eident, ehost, phrase->id, messagetype, glining);
     trojanscan_database.glines++;
     
-    irc_send("%s GL * +%s %d :You (%s!%s@%s) are infected with a trojan (%s/%d), see %s%d for details - banned for %d hours\r\n", mynumeric->content, glinemask, glinetime * 3600, sender->nick, sender->ident, sender->host->name->content, worm->name->content, phrase->id, TROJANSCAN_URL_PREFIX, worm->id, glinetime);
+    irc_send("%s GL * +%s %d %jd :You (%s!%s@%s) are infected with a trojan (%s/%d), see %s%d for details - banned for %d hours\r\n", mynumeric->content, glinemask, glinetime * 3600, (intmax_t)time(NULL), sender->nick, sender->ident, sender->host->name->content, worm->name->content, phrase->id, TROJANSCAN_URL_PREFIX, worm->id, glinetime);
 
-    trojanscan_mainchanmsg("g: *!%s t: %c u: %s!%s@%s%s%s c: %d w: %s%s p: %d f: %d", glinemask, messagetype, sender->nick, sender->ident, sender->host->name->content, messagetype=='N'||messagetype=='M'||messagetype=='P'?" #: ":"", messagetype=='N'||messagetype=='M'||messagetype=='P'?chp->index->name->content:"", usercount, worm->name->content, worm->epidemic?"(E)":"", phrase->id, frequency);
+    trojanscan_mainchanmsg("g: *!%s t: %c u: %s!%s@%s%s%s c: %d w: %s%s p: %d f: %d%s%s", glinemask, messagetype, sender->nick, sender->ident, sender->host->name->content, messagetype=='N'||messagetype=='M'||messagetype=='P'?" #: ":"", messagetype=='N'||messagetype=='M'||messagetype=='P'?chp->index->name->content:"", usercount, worm->name->content, worm->epidemic?"(E)":"", phrase->id, frequency, matchbuf[0]?" --: ":"", matchbuf[0]?matchbuf:"");
   }
 }
             
@@ -2363,6 +2392,16 @@ host *trojanscan_selecthost(void) {
   return NULL;
 }
 
+static int specialuseronhost(host *hp) {
+  nick *np;
+
+  for(np=hp->nicks;np;np=np->nextbyhost)
+    if(IsOper(np) || IsService(np) || IsXOper(np) || NickOnServiceServer(np))
+      return 1;
+
+  return 0;
+}
+
 void trojanscan_generatehost(char *buf, int maxsize, patricia_node_t **fakeip) {
   struct irc_in_addr ipaddress;
 
@@ -2374,7 +2413,7 @@ void trojanscan_generatehost(char *buf, int maxsize, patricia_node_t **fakeip) {
 
     do {
       hp = trojanscan_selecthost();
-      if(hp && (hp->clonecount <= TROJANSCAN_MAX_CLONE_COUNT) && !trojanscan_isip(hp->name->content)) {
+      if(hp && (hp->clonecount <= TROJANSCAN_MAX_CLONE_COUNT) && !trojanscan_isip(hp->name->content) && !specialuseronhost(hp)) {
         strlcpy(buf, hp->name->content, maxsize + 1);
         if(hp->nicks) {
           *fakeip = hp->nicks->ipnode;