]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Merge throttle.
authorGunnar Beutner <redacted>
Mon, 12 Aug 2013 22:45:38 +0000 (00:45 +0200)
committerGunnar Beutner <redacted>
Mon, 12 Aug 2013 22:45:38 +0000 (00:45 +0200)
37 files changed:
.hgignore
MODULES
chanserv/newsearch/interface.c
control/Makefile
control/control.c
control/control.h
control/control_commands.c [moved from noperserv/noperserv_commands.c with 97% similarity]
control/control_db.c [new file with mode: 0644]
control/control_db.h [moved from noperserv/noperserv_db.h with 50% similarity]
control/control_management.c [moved from noperserv/noperserv.c with 67% similarity]
control/control_policy.c [moved from noperserv/noperserv_policy.c with 96% similarity]
control/control_policy.h [moved from noperserv/noperserv_policy.h with 100% similarity]
core/main.c
lib/flags.c
newsearch/newsearch.c
newsearch/newsearch.h
newsearch/newsearch_ast.c
nick/nick.c
nick/nick.h
nickwatch/Makefile [new file with mode: 0644]
nickwatch/nickwatch.c [new file with mode: 0644]
noperserv/Makefile [deleted file]
noperserv/noperserv.h [deleted file]
noperserv/noperserv_db.c [deleted file]
noperserv/noperserv_hooks.c [deleted file]
noperserv/noperserv_hooks.h [deleted file]
patriciasearch/newsearch_ast.c
patriciasearch/patriciasearch.c
patriciasearch/patriciasearch.h
raw/Makefile [new file with mode: 0644]
raw/raw.c [moved from noperserv/noperserv_raw.c with 100% similarity]
request/lrequest.c
request/request.c
request/request.h
request/sqrequest.c
trusts/trusts_commands.c
trusts/trusts_management.c

index ee54fa3710d5d7ce87740dcf216c3342e927d61b..6019e7054dab33a507dd4ed256735b5ada59687e 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -31,3 +31,4 @@ lex.yy.c
 core.*
 .autobuild.mk
 .configure.log
+*.orig
diff --git a/MODULES b/MODULES
index eb4aa654ce1f914c4d17d8465d6ae18ac2c8134e..64ed5a786dc3a5a55f3b77ea26911a62cfe09e95 100644 (file)
--- a/MODULES
+++ b/MODULES
@@ -42,6 +42,10 @@ Configuration:
 
 [control]
 nick=N3
+#ident=control
+#hostname=your.hostname.here
+#realname=NewServ Control Service
+#authname=C
 
 auth
 ~~~
@@ -92,6 +96,16 @@ glines
 Implements gline commands and general gline functionality that is used by other
 modules.
 
+geoip
+~~~~
+
+Provides geo-location services for other modules.
+
+Configuration:
+
+[geoip]
+#db=GeoIP.dat
+
 helpmod2
 ~~~~~~~
 
@@ -135,6 +149,18 @@ miscreply
 
 Implements rping and various other status query commands.
 
+Configuration:
+
+[miscreply]
+#admin1=Located at the Union Aerospace Corp. facility, Stroggos
+#admin2=Network IRC Service
+#admin3=No administrative info available
+
+patricia, patricianick, patriciasearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implements finding nicks based on CIDR prefixes.
+
 proxyscan
 ~~~~~~~~
 
@@ -143,9 +169,19 @@ Does on-connect proxy scans and glines open proxies.
 request
 ~~~~~~
 
-This is QuakeNet's channel service request bot (R). Some of the module
-parameters are not configurable - instead you will have to modify the
-request/request.h header file and recompile the module.
+This is QuakeNet's channel service request bot (R).
+
+Configuration:
+
+[request]
+#nick=R
+#user=request
+#host=request.quakenet.org
+#real=Service Request v0.23
+#snick=S
+#sserver=spamscan.quakenet.org
+#qnick=Q
+#qserver=cserve.quakenet.org
 
 serverlist
 ~~~~~~~~~
@@ -173,9 +209,10 @@ trusts
 ~~~~~
 
 Implements connection limits. Supports the TRUST protocol which is used
-by quakenet-iauthd to determine whether to allow users on the network.
+by quakenet-iauthd to determine whether to allow users to connect to the
+network.
 
-You will need to load the trusts_master module on one of your newserv
+You will need to load the trusts_master module on exactly one of your newserv
 instances. All other instances should load the trusts_slave module in order
 to receive replication updates from the trusts master:
 
@@ -201,12 +238,15 @@ You can use the QuakeNet IAuth daemon available at
 http://hg.quakenet.org/iauthd/ to enforce connection limits using IAuth rather
 than g:lines.
 
-whowas
-~~~~~
+whowas, whowas_channels
+~~~~~~~~~~~~~~~~~~~~~~
 
 Keeps track of historical user records. Used by the glines module to chase
 nicks and by newsearch.
 
+The whowas_channels module optionally keeps track of which channels users
+were on.
+
 xsb
 ~~
 
index 79b1fee08d7ac5dee5eb8ded7bda015109bf0629..6eaa036bfe51da8be3dd61c05eaf3e1cc9efdc4f 100644 (file)
@@ -103,7 +103,7 @@ int cs_dospewemail(void *source, int cargc, char **cargv) {
   cs_log(source, "SPEWEMAIL %s", cargv[0]);
 
   tree = NSASTNode(match_parse, NSASTNode(qemail_parse), NSASTLiteral(cargv[0]));
-  return ast_usersearch(&tree, chanservmessagewrapper, source, chanservwallwrapper, printauth, showheader, (void *)QM_SPEWHEADER, 2000);
+  return ast_usersearch(&tree, chanservmessagewrapper, source, chanservwallwrapper, printauth, showheader, (void *)QM_SPEWHEADER, 2000, NULL);
 }
 
 int cs_dospewdb(void *source, int cargc, char **cargv) {
@@ -123,6 +123,6 @@ int cs_dospewdb(void *source, int cargc, char **cargv) {
       NSASTNode(match_parse, NSASTNode(qemail_parse), NSASTLiteral(cargv[0])),
       NSASTNode(match_parse, NSASTNode(qlasthost_parse), NSASTLiteral(cargv[0])),
     );
-  return ast_usersearch(&tree, chanservmessagewrapper, source, chanservwallwrapper, printauth, showheader, (void *)QM_SPEWHEADER, 2000);
+  return ast_usersearch(&tree, chanservmessagewrapper, source, chanservwallwrapper, printauth, showheader, (void *)QM_SPEWHEADER, 2000, NULL);
 }
 
index 21900eb3d091e604dd10597c288e05358b7d3e60..1365c6f20f1c2caacef6ba5bd4bb55146a8d0762 100644 (file)
@@ -1,8 +1,12 @@
 include ../build.mk
 
 .PHONY: all
-all: control.so
+all: control.so control_commands.so control_management.so
 
 control-lite.so: control-lite.o
 
-control.so: control.o
+control.so: control.o control_db.o control_policy.o
+
+control_commands.so: control_commands.o
+
+control_management.so: control_management.o
index e55879653fb83de6a1a01a05330298fb4c5454bd..29d64f94051d0fe3a1eaec26c44f32cfb2730db9 100644 (file)
@@ -22,6 +22,7 @@
 #include "../lib/version.h"
 #include "../lib/irc_string.h"
 #include "control.h"
+#include "control_policy.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -34,16 +35,58 @@ nick *hooknick;
 nick *mynick;
 
 CommandTree *controlcmds;
-ControlMsg controlreply;
-ControlWall controlwall;
-ControlPermitted controlpermitted;
 DestroyExt controldestroyext;
+int noperserv_ext;
+
+const flag no_commandflags[] = {
+    { 'o', __NO_OPER },
+    { 't', __NO_TRUST },
+    { 's', __NO_STAFF },
+    { 'S', __NO_SEC },
+    { 'd', __NO_DEVELOPER },
+    { 'L', __NO_LEGACY },
+    { 'O', __NO_OPERED },
+    { 'r', __NO_AUTHED },
+    { 'R', __NO_ACCOUNT },
+    { 'Y', __NO_RELAY },
+    { '\0', 0 }
+  };
+
+const flag no_userflags[] = {
+    { 'o', __NO_OPER },
+    { 't', __NO_TRUST },
+    { 's', __NO_STAFF },
+    { 'S', __NO_SEC },
+    { 'd', __NO_DEVELOPER },
+    { 'Y', __NO_RELAY },
+    { '\0', 0 }
+  };
+
+const flag no_noticeflags[] = {
+    { 'm', NL_MANAGEMENT },   /* hello, password, userflags, noticeflags */
+    { 't', NL_TRUSTS },       /* trust stuff... */
+    { 'k', NL_KICKKILLS },    /* KICK/KILL commands */
+    { 'I', NL_MISC },         /* misc commands */
+    { 'g', NL_GLINES },       /* GLINE commands */
+    { 'G', NL_GLINES_AUTO },  /* automated gline messages */
+    { 'h', NL_HITS },         /* Where a gline or kill is set automatically by the bot */
+    { 'c', NL_CLONING },      /* Clone detection */
+    { 'C', NL_CLEARCHAN },    /* When someone clearchans */
+    { 'f', NL_FAKEUSERS },    /* Fakeuser addition */
+    { 'b', NL_BROADCASTS },   /* Broadcast/mbroadcast/sbroadcast */
+    { 'o', NL_OPERATIONS },   /* insmod/rmmod/etc */
+    { 'O', NL_OPERING },      /* when someone opers */
+    { 'n', NL_NOTICES },      /* turn off to receive notices instead of privmsgs */
+    { 'A', NL_ALL_COMMANDS }, /* all commands sent */
+    { '\0', 0 }
+  };
 
 void controldestroycmdext(void *ext); 
 void handlemessages(nick *target, int messagetype, void **args);
 int controlstatus(void *sender, int cargc, char **cargv);
 void controlconnect(void *arg);
 int controlwhois(void *sender, int cargc, char **cargv);
+int controllistusers(void *sender, int cargc, char **cargv);
 int controlchannel(void *sender, int cargc, char **cargv);
 int relink(void *sender, int cargc, char **cargv);
 int die(void *sender, int cargc, char **cargv);
@@ -56,16 +99,25 @@ void controlnoticeopers(flag_t permissionlevel, flag_t noticelevel, char *format
 void controlnoticeopers(flag_t permissionlevel, flag_t noticelevel, char *format, ...);
 int controlcheckpermitted(flag_t level, nick *user);
 void handlesignal(int hooknum, void *arg);
+void noperserv_oper_detection(int hooknum, void *arg);
+void noperserv_whois_handler(int hooknum, void *arg);
+void noperserv_whois_account_handler(int hooknum, void *arg);
+
+#define HOOK_CONTROL_WHOISREQUEST_AUTHNAME -1
+#define HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER -2
+
+static int init;
 
 void _init() {
+  if(!noperserv_load_db())
+    return;
+
   controlcmds=newcommandtree();
-  controlreply=&controlmessage;
-  controlwall=&controlnoticeopers;
-  controlpermitted=&controlcheckpermitted;
   controldestroyext=&controldestroycmdext;
 
   registercontrolhelpcmd("status",NO_DEVELOPER,1,&controlstatus,"Usage: status ?level?\nDisplays status information, increasing level gives more verbose information.");
   registercontrolhelpcmd("whois",NO_OPERED,1,&controlwhois,"Usage: whois <nickname|#numeric>\nDisplays lots of information about the specified nickname or numeric.");
+  registercontrolhelpcmd("listusers", NO_OPERED | NO_ACCOUNT, 2, &controllistusers, "Syntax: LISTUSERS\nLists all accounts.");
   registercontrolhelpcmd("channel",NO_OPER,1,&controlchannel,"Usage: channel <#channel>\nDisplays channel information.");
   registercontrolhelpcmd("relink",NO_DEVELOPER,1,&relink,"Usage: relink\nRelinks service to the network.");
   registercontrolhelpcmd("die",NO_DEVELOPER,1,&die,"Usage: die <reason>\nTerminates the service.");
@@ -79,10 +131,20 @@ void _init() {
  
   registerhook(HOOK_CORE_REHASH, &handlesignal);
   registerhook(HOOK_CORE_SIGINT, &handlesignal);
+  registerhook(HOOK_NICK_MODEOPER, &noperserv_oper_detection);
+  registerhook(HOOK_CONTROL_WHOISREQUEST, &noperserv_whois_handler);
+
+  noperserv_ext = registerauthnameext("noperserv", 1);
+
   scheduleoneshot(time(NULL)+1,&controlconnect,NULL);
+
+  init = 1;
 }
 
 void _fini() {
+  if (!init)
+    return;
+
   deleteallschedules(&controlconnect);
   if (mynick) {
     deregisterlocaluser(mynick,"Leaving");
@@ -90,6 +152,7 @@ void _fini() {
   
   deregistercontrolcmd("status",&controlstatus);
   deregistercontrolcmd("whois",&controlwhois);
+  deregistercontrolcmd("listusers", &controllistusers);
   deregistercontrolcmd("channel",&controlchannel);
   deregistercontrolcmd("relink",&relink);
   deregistercontrolcmd("die",&die);
@@ -105,6 +168,12 @@ void _fini() {
 
   deregisterhook(HOOK_CORE_REHASH, &handlesignal);
   deregisterhook(HOOK_CORE_SIGINT, &handlesignal);
+  deregisterhook(HOOK_NICK_MODEOPER, &noperserv_oper_detection);
+  deregisterhook(HOOK_CONTROL_WHOISREQUEST, &noperserv_whois_handler);
+
+  releaseauthnameext(noperserv_ext);
+
+  noperserv_cleanup_db();
 }
 
 void registercontrolhelpcmd(const char *name, int level, int maxparams, CommandHandler handler, char *helpstr) {
@@ -217,7 +286,7 @@ void handlewhois(int hooknum, void *arg) {
   controlreply(hooknick,"%s",(char *)arg);
 }
 
-int controlwhois(void *sender, int cargc, char **cargv) {
+static int controlwhois_plain(void *sender, int cargc, char **cargv) {
   nick *target;
   channel **channels;
   char buf[BUFSIZE];
@@ -316,6 +385,160 @@ int controlwhois(void *sender, int cargc, char **cargv) {
   return CMD_OK;
 }
 
+int controlwhois(void *sender, int cargc, char **cargv) {
+  authname *an;
+  no_autheduser *au;
+  nick *np = (nick *)sender;
+
+  if(cargc < 1)
+    return controlwhois_plain(sender, cargc, cargv);
+
+  if(cargv[0][0] != '#') {
+    if(cargv[0][0] == '*')
+      cargv[0][0] = '#';
+    return controlwhois_plain(sender, cargc, cargv);
+  }
+
+  an = findauthnamebyname(cargv[0] + 1);
+  if(!an) {
+    controlreply(np, "Account not registered.");
+    return CMD_OK;
+  }
+
+  au = noperserv_get_autheduser(an);
+  if(!au) {
+    controlreply(np, "User does not have a NOperserv account.");
+    return CMD_OK;
+  }
+
+  controlreply(np, "Account   : %s", au->authname->name);
+
+  hooknick = np;
+
+  registerhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+  noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
+  deregisterhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+
+  controlreply(np, "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
+
+  return CMD_OK;
+}
+
+void noperserv_whois_handler(int hooknum, void *arg) {
+  char message[100];
+  nick *np = (nick *)arg;
+  no_autheduser *au;
+  if(!np)
+    return;
+
+  if(IsAccount(np)) {
+    au = NOGetAuthedUser(np);
+    if(au) {
+      snprintf(message, sizeof(message), "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
+      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
+    } else {
+      snprintf(message, sizeof(message), "Flags     : (user not known)");
+      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHNAME, (void *)np->authname);
+    }
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+  }
+}
+
+/* mmm, hacky */
+void noperserv_whois_account_handler(int hooknum, void *arg) {
+  int count = 0, found = 0;
+  char nickbuffer[(NICKLEN + 2) * NO_NICKS_PER_WHOIS_LINE - 1]; /* since we don't need space or comma for the first item we're fine NULL wise */
+  char accountspace[NICKLEN + 3]; /* space, comma, null */
+  char message[1024];
+  nick *np;
+
+  nickbuffer[0] = '\0';
+  if(hooknum == HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER) {
+    /* we can just read out the authed user linked list */
+    no_autheduser *au = (void *)arg;
+
+    if(au->authname->nicks)
+      found = 1;
+
+    for(np=au->authname->nicks;np;np=np->nextbyauthname) {
+      snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", np->nick);
+      strncat(nickbuffer, accountspace, sizeof(nickbuffer));
+      nickbuffer[sizeof(nickbuffer) - 1] = '\0';
+
+      if(count >= NO_NICKS_PER_WHOIS_LINE) {
+        snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
+        triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+        nickbuffer[0] = '\0';
+        count = 0;
+      }
+    }
+  } else {
+    /* inefficient way */
+    char *authname = (char *)arg;
+    int i = 0;
+    nick *sp;
+
+    for(;i<NICKHASHSIZE;i++)
+      for(sp=nicktable[i];sp;sp=sp->next)
+        if(IsAccount(sp) && !ircd_strcmp(sp->authname, authname)) {
+          found = 1;
+
+          snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", sp->nick);
+          strncat(nickbuffer, accountspace, sizeof(nickbuffer));
+          nickbuffer[sizeof(nickbuffer) - 1] = '\0';
+
+          if(count >= NO_NICKS_PER_WHOIS_LINE) {
+            snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
+            triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+            nickbuffer[0] = '\0';
+            count = 0;
+          }
+        }
+  }
+
+  if(!found) {
+    snprintf(message, sizeof(message), "Authed    : (no nicks authed)");
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+  } else if(nickbuffer[0]) {
+    snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+  }
+}
+
+int controllistusers(void *sender, int cargc, char **cargv) {
+  nick *np = (nick *)sender;
+  int i, count = 0;
+  authname *anp;
+  no_autheduser *au;
+
+  hooknick = np;
+
+  registerhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;anp=anp->next) {
+      au = noperserv_get_autheduser(anp);
+      if(!au)
+        continue;
+
+      if (count > 0)
+        controlreply(np, "---");
+
+      controlreply(np, "Account   : %s", au->authname->name);
+      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
+      controlreply(np, "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
+
+      count++;
+    }
+  }
+
+  deregisterhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+
+  controlreply(np, "--- Found %d users.", count);
+
+  return CMD_OK;
+}
+
 int controlinsmod(void *sender, int cargc, char **cargv) {
   if (cargc<1)
     return CMD_USAGE;
@@ -486,19 +709,19 @@ int controlchannel(void *sender, int cargc, char **cargv) {
 }
 
 int controlshowcommands(void *sender, int cargc, char **cargv) {
-  nick *np=(nick *)sender;
+  nick *np = (nick *)sender;
   Command *cmdlist[100];
-  int i,n;
-    
-  n=getcommandlist(controlcmds,cmdlist,100);
-  
-  controlreply(np,"The following commands are registered at present:");
-  
-  for(i=0;i<n;i++) {
-    controlreply(np,"%s",cmdlist[i]->command->content);
-  }
+  int i, n;
+
+  n = getcommandlist(controlcmds, cmdlist, 100);
+
+  controlreply(np, "The following commands are registered at present:");
 
-  controlreply(np,"End of list.");
+  for(i=0;i<n;i++)
+    if(noperserv_policy_command_permitted(cmdlist[i]->level, np))
+      controlreply(np, " %-25s %s", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
+
+  controlreply(np, "End of list.");
   return CMD_OK;
 }
   
@@ -512,31 +735,22 @@ void handlemessages(nick *target, int messagetype, void **args) {
     case LU_PRIVMSG:
     case LU_SECUREMSG:
       /* If it's a message, first arg is nick and second is message */
-      sender=(nick *)args[0];
+      sender = (nick *)args[0];
 
-      Error("control",ERR_INFO,"From: %s!%s@%s: %s",sender->nick,sender->ident,sender->host->name->content, (char *)args[1]);
+      controlwall(NO_DEVELOPER, NL_ALL_COMMANDS, "From: %s!%s@%s%s%s: %s", sender->nick, sender->ident, sender->host->name->content, IsAccount(sender)?"/":"", IsAccount(sender)?sender->authname:"", (char *)args[1]);
 
       /* Split the line into params */
-      cargc=splitline((char *)args[1],cargv,50,0);
+      cargc = splitline((char *)args[1], cargv, 50, 0);
       
-      if (!cargc) {
-        /* Blank line */
+      if(!cargc) /* Blank line */
         return;
-      } 
                
-      cmd=findcommandintree(controlcmds,cargv[0],1);
-      if (cmd==NULL) {
-        controlreply(sender,"Unknown command.");
-        return;
-      }
-      
-      if (cmd->level>0 && !IsOper(sender)) {
-        controlreply(sender,"You need to be opered to use this command.");
+      cmd = findcommandintree(controlcmds,cargv[0],1);
+      if(!cmd || !noperserv_policy_command_permitted(cmd->level, sender)) {
+        controlreply(sender, "Unknown command or access denied.");
         return;
       }
       
-      /* If we were doing "authed user tracking" here we'd put a check in for authlevel */
-      
       /* Check the maxargs */
       if (cmd->maxparams<(cargc-1)) {
         /* We need to do some rejoining */
@@ -546,6 +760,7 @@ void handlemessages(nick *target, int messagetype, void **args) {
       
       if((cmd->handler)((void *)sender,cargc-1,&(cargv[1])) == CMD_USAGE)
         controlhelp(sender, cmd);
+
       break;
       
     case LU_KILLED:
@@ -553,6 +768,7 @@ void handlemessages(nick *target, int messagetype, void **args) {
       scheduleoneshot(time(NULL)+1,&controlconnect,NULL);
       mynick=NULL;
       triggerhook(HOOK_CONTROL_REGISTERED, NULL);
+
       break;
       
     default:
@@ -605,6 +821,51 @@ void controlnotice(nick *target, char *message, ... ) {
   sendnoticetouser(mynick,target,"%s",buf);
 }
 
+void controlreply(nick *np, char *format, ...) {
+  char buf[512];
+  va_list va;
+  no_autheduser *au = NOGetAuthedUser(np);
+
+  va_start(va, format);
+  vsnprintf(buf, sizeof(buf), format, va);
+  va_end(va);
+
+  if(au && !(NOGetNoticeLevel(au) & NL_NOTICES)) {
+    controlmessage(np, "%s", buf);
+  } else {
+    controlnotice(np, "%s", buf);
+  }
+}
+
+void controlwall(flag_t permissionlevel, flag_t noticelevel, char *format, ...) {
+  char buf[512];
+  va_list va;
+  char *flags = printflags(noticelevel, no_noticeflags) + 1;
+  int i;
+  authname *anp;
+  no_autheduser *au;
+  nick *np;
+
+  va_start(va, format);
+  vsnprintf(buf, sizeof(buf), format, va);
+  va_end(va);
+
+  Error("noperserv", ERR_INFO, "$%s$ %s", flags, buf);
+
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;anp=anp->next) {
+      au = noperserv_get_autheduser(anp);
+      if(!au)
+        continue;
+      if((NOGetNoticeLevel(au) & noticelevel) && !(NOGetAuthLevel(au) & __NO_RELAY)) {
+        for(np=anp->nicks;np;np=np->nextbyauthname)
+          if(noperserv_policy_command_permitted(permissionlevel, np))
+            controlreply(np, "$%s$ %s", flags, buf);
+      }
+    }
+  }
+}
+
 void controlspecialrmmod(void *arg) {
   struct specialsched *a = (struct specialsched *)arg;
   sstring *froo = a->modulename;
@@ -671,12 +932,12 @@ int controlhelpcmd(void *sender, int cargc, char **cargv) {
   Command *cmd;
   nick *np = (nick *)sender;
 
-  if (cargc<1)
+  if(cargc < 1)
     return CMD_USAGE;
 
-  cmd=findcommandintree(controlcmds,cargv[0],1);
-  if (cmd==NULL) {
-    controlreply(np,"Unknown command.");
+  cmd = findcommandintree(controlcmds, cargv[0], 1);
+  if(!cmd || !noperserv_policy_command_permitted(cmd->level, np)) {
+    controlreply(np, "Unknown command or access denied.");
     return CMD_ERROR;
   }
 
@@ -711,8 +972,8 @@ void controlnswall(int noticelevel, char *format, ...) {
   controlwall(NO_OPER, noticelevel, "%s", broadcast);
 }
 
-int controlcheckpermitted(flag_t level, nick *user) {
-  return 1;
+int controlpermitted(flag_t level, nick *user) {
+  return noperserv_policy_command_permitted(level, user);
 }
 
 void handlesignal(int hooknum, void *arg) {
@@ -747,3 +1008,17 @@ char *controlid(nick *np) {
   return buf;
 }
 
+void noperserv_oper_detection(int hooknum, void *arg) {
+  nick *np = (nick *)arg;
+
+  if(np->umodes & UMODE_OPER) {
+    if(np->opername && strcmp(np->opername->content, "-")) {
+      controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just OPERed as %s", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"", np->opername->content);
+    } else {
+      controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just OPERed", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"");
+    }
+  } else {
+    controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just DEOPERed", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"");
+  }
+}
+
index dc43662e151e62b52f3a32252a7255d7789f15a5..c4bc629884941f679b11259bde96ad319cadbc27 100644 (file)
@@ -2,19 +2,17 @@
 #ifndef __CONTROL_H
 #define __CONTROL_H
 
+#include "control_db.h"
+#include "../lib/flags.h"
 #include "../parser/parser.h"
 #include "../nick/nick.h"
 #include "../channel/channel.h"
 
 #define registercontrolcmd(a, b, c, d) registercontrolhelpcmd(a, b, c, d, NULL)
 
-typedef void (*ControlMsg)(nick *, char *, ... );
-typedef void (*ControlWall)(flag_t, flag_t, char *, ...);
-typedef int (*ControlPermitted)(flag_t, nick *);
-
-extern ControlMsg controlreply;
-extern ControlWall controlwall;
-extern ControlPermitted controlpermitted;
+void controlreply(nick *, char *, ...);
+void controlwall(flag_t, flag_t, char *, ...);
+int controlpermitted(flag_t, nick *);
 
 extern nick *mynick;
 
@@ -101,4 +99,18 @@ char *controlid(nick *);
 #define NL_ALL_COMMANDS    0x2000  /* every single command sent */
 #define NL_GLINES_AUTO     0x4000  /* automated gline messages */
 
+extern int noperserv_ext;
+
+extern const flag no_userflags[];
+extern const flag no_noticeflags[];
+extern const flag no_commandflags[];
+
+#define NO_NICKS_PER_WHOIS_LINE 3
+
+#define NOGetAuthedUser(user)  (no_autheduser *)(user->auth ? user->auth->exts[noperserv_ext] : NULL)
+#define NOGetAuthLevel(user)   user->authlevel
+#define NOGetNoticeLevel(user) user->noticelevel
+#define NOMax(a, b) (a>b?a:b)
+#define NOMin(a, b) (a<b?b:a)
+
 #endif  
similarity index 97%
rename from noperserv/noperserv_commands.c
rename to control/control_commands.c
index 5c14dc494430fa95bb242906477153c13a555bf1..928e448873ec0df95a9f77367af36362689363b3 100644 (file)
@@ -119,7 +119,7 @@ int controlspew(void *sender, int cargc, char **cargv) {
     return CMD_USAGE;
 
   tree = NSASTNode(match_parse, NSASTNode(hostmask_parse), NSASTLiteral(cargv[0]));
-  return ast_nicksearch(&tree, controlreply, sender, controlnswall, printnick, NULL, NULL, 500);
+  return ast_nicksearch(&tree, controlreply, sender, controlnswall, printnick, NULL, NULL, 500, NULL);
 }
 
 int controlspewchan(void *sender, int cargc, char **cargv) {
@@ -129,7 +129,7 @@ int controlspewchan(void *sender, int cargc, char **cargv) {
     return CMD_USAGE;
 
   tree = NSASTNode(match_parse, NSASTNode(name_parse), NSASTLiteral(cargv[0]));
-  return ast_chansearch(&tree, controlreply, sender, controlnswall, printchannel, NULL, NULL, 500);
+  return ast_chansearch(&tree, controlreply, sender, controlnswall, printchannel, NULL, NULL, 500, NULL);
 }
 
 int controlcompare(void *sender, int cargc, char **cargv) {
@@ -158,7 +158,7 @@ int controlcompare(void *sender, int cargc, char **cargv) {
   }
   tree = NSASTManualNode(and_parse, cargc, nodes);
   
-  return (execfn)(&tree, controlreply, sender, controlnswall, displayfn, NULL, NULL, 500);
+  return (execfn)(&tree, controlreply, sender, controlnswall, displayfn, NULL, NULL, 500, NULL);
 }
 
 int controlbroadcast(void *sender, int cargc, char **cargv) {
@@ -218,7 +218,7 @@ int controlobroadcast(void *sender, int cargc, char **cargv) {
   snprintf(message, sizeof(message), "(oBroadcast) %s", cargv[0]);
 
   tree = NSASTNode(and_parse, NSASTNode(modes_parse, NSASTLiteral("+o")), NSASTNode(notice_parse, NSASTLiteral(message)));
-  if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1)) == CMD_OK) {
+  if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
     controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an obroadcast: %s", np->nick, np->authname, cargv[0]);
     controlreply(np, "Message obroadcasted.");
   } else {
@@ -239,7 +239,7 @@ int controlcbroadcast(void *sender, int cargc, char **cargv) {
 
   snprintf(message, sizeof(message), "(cBroadcast) %s", cargv[1]);
   tree = NSASTNode(and_parse, NSASTNode(country_parse, NSASTLiteral(cargv[0])), NSASTNode(notice_parse, NSASTLiteral(message)));
-  if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1)) == CMD_OK) {
+  if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
     controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a cbroadcast %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
     controlreply(np, "Message cbroadcasted.");
   } else {
diff --git a/control/control_db.c b/control/control_db.c
new file mode 100644 (file)
index 0000000..3aaee52
--- /dev/null
@@ -0,0 +1,164 @@
+/* 
+ * NOperserv v0.01
+ *
+ * A replacement for Germania's ageing Operservice2
+ * DB functions
+ *
+ * Copyright (C) 2005 Chris Porter.
+ */
+
+#include "../nick/nick.h"
+#include "../core/error.h"
+#include "../lib/irc_string.h"
+#include "../core/schedule.h"
+#include "../dbapi2/dbapi2.h"
+
+#include "control.h"
+
+#include <stdlib.h>
+
+int db_loaded = 0;
+unsigned long loadedusers = 0;
+
+void noperserv_create_tables(void);
+
+void noperserv_free_user(no_autheduser *au);
+void noperserv_load_users(const DBAPIResult *res, void *arg);
+
+static DBAPIConn *nodb;
+
+int noperserv_load_db(void) {
+  if(!nodb) {
+    nodb = dbapi2open(DBAPI2_DEFAULT, "noperserv");
+    if(!nodb) {
+      Error("noperserv", ERR_STOP, "Could not connect to database.");
+      return 0;
+    }
+  }
+
+  db_loaded = 1;
+
+  noperserv_create_tables();
+
+  nodb->query(nodb, noperserv_load_users, NULL,
+    "SELECT userid, authname, flags, noticelevel FROM ?", "T", "users");
+
+  return 1;
+}
+
+void noperserv_load_users(const DBAPIResult *res, void *arg) {
+  no_autheduser *nu;
+
+  if(!res)
+    Error("control", ERR_STOP, "Failed to load noperserv database. Your database might be corrupted or the schema is incompatible.");
+
+  if(!res->success) {
+    Error("noperserv", ERR_ERROR, "Error loading user list.");
+    res->clear(res);
+    return;
+  }
+
+  while(res->next(res)) {
+    nu = noperserv_new_autheduser(strtoul(res->get(res, 0), NULL, 10), res->get(res, 1));
+    if(!nu)
+      continue;
+
+    nu->authlevel = strtoul(res->get(res, 2), NULL, 10);
+    nu->noticelevel = strtoul(res->get(res, 3), NULL, 10);
+    nu->newuser = 0;
+  }
+
+  Error("noperserv", ERR_INFO, "Loaded %lu users", loadedusers);
+  
+  res->clear(res);
+}
+
+void noperserv_create_tables(void) {
+  nodb->createtable(nodb, NULL, NULL,
+    "CREATE TABLE ? ("
+      "userid        INT               NOT NULL,"
+      "authname      VARCHAR(?)        NOT NULL,"
+      "flags         INT               NOT NULL,"
+      "noticelevel   INT               NOT NULL,"
+      "PRIMARY KEY (userid))", "Td", "users", ACCOUNTLEN);
+}
+
+void noperserv_cleanup_db(void) {
+  int i;
+  authname *anp, *next;
+  no_autheduser *au;
+
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;) {
+      next = anp->next;
+
+      au = anp->exts[noperserv_ext];
+      if(au)
+        noperserv_free_user(au);
+
+      anp = next;
+    }
+  }
+
+  nodb->close(nodb);
+  nodb = NULL;
+}
+
+no_autheduser *noperserv_new_autheduser(unsigned long userid, char *name) {
+  authname *anp;
+  no_autheduser *au;
+
+  anp = findorcreateauthname(userid, name);
+  if(!anp)
+    return NULL;
+
+  au = malloc(sizeof(no_autheduser));
+  if(!au)
+    return NULL;
+
+  au->authname = anp;
+
+  loadedusers++;
+  au->newuser = 1;
+
+  anp->exts[noperserv_ext] = au;
+
+  return au;
+}
+
+void noperserv_delete_autheduser(no_autheduser *au) {
+  if(!au->newuser)
+    nodb->squery(nodb, "DELETE FROM ? WHERE userid = ?", "Tu", "users", au->authname->userid);
+
+  noperserv_free_user(au);
+}
+
+void noperserv_update_autheduser(no_autheduser *au) {
+  if(au->newuser) {
+    nodb->squery(nodb, "INSERT INTO ? (userid, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au->authname->userid, au->authname->name, NOGetAuthLevel(au), NOGetNoticeLevel(au));
+    au->newuser = 0;
+  } else {
+    nodb->squery(nodb, "UPDATE ? SET flags = ?, noticelevel = ? WHERE userid = ?", "Tuuu", "users", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->authname->userid);
+  }
+}
+
+void noperserv_free_user(no_autheduser *au) {
+  authname *anp = au->authname;
+  anp->exts[noperserv_ext] = NULL;
+  releaseauthname(anp);
+  free(au);
+
+  loadedusers--;
+}
+
+no_autheduser *noperserv_get_autheduser(authname *anp) {
+  if (!anp)
+    return NULL;
+
+  return anp->exts[noperserv_ext];
+}
+
+unsigned long noperserv_get_autheduser_count(void) {
+  return loadedusers;
+}
+
similarity index 50%
rename from noperserv/noperserv_db.h
rename to control/control_db.h
index 16814b020d7d4b3a9451c9223b33fb0d719ab55e..89e9f22f6228a743721cb2dd691f7e0d036f4a58 100644 (file)
@@ -1,35 +1,25 @@
 #ifndef __NOPERSERV_STRUCTS_H
 #define __NOPERSERV_STRUCTS_H
 
-typedef unsigned long no_tableid;
+#include "../authext/authext.h"
 
-typedef struct no_nicklist {
-  nick *nick;
-  struct no_nicklist *next;
-} no_nicklist;
+typedef unsigned long no_tableid;
 
 typedef struct no_autheduser {
   unsigned newuser: 1;
-  sstring *authname;
+  authname *authname;
   flag_t authlevel;
   flag_t noticelevel;
-  no_tableid id;
-  struct no_autheduser *next;
-  no_nicklist *nick;
 } no_autheduser;
 
 int noperserv_load_db(void);
 void noperserv_cleanup_db(void);
 
-extern no_autheduser *authedusers;
-
 void noperserv_delete_autheduser(no_autheduser *au);
-no_autheduser *noperserv_new_autheduser(char *authname);
-no_autheduser *noperserv_get_autheduser(char *authname);
+no_autheduser *noperserv_new_autheduser(unsigned long userid, char *ame);
+no_autheduser *noperserv_get_autheduser(authname *an);
 void noperserv_update_autheduser(no_autheduser *au);
-void noperserv_add_to_autheduser(nick *np, no_autheduser *au);
 
 unsigned long noperserv_get_autheduser_count(void);
-unsigned long noperserv_next_autheduser_id(void);
 
 #endif
similarity index 67%
rename from noperserv/noperserv.c
rename to control/control_management.c
index ae5c3c1062c03079923834e8bbc9753df684e3ca..66c1106a6d3de7d7905d63cfe45f7ef0a9c97444 100644 (file)
 #include "../lib/strlfunc.h"
 #include "../lib/version.h"
 #include "../authext/authext.h"
-#include "noperserv.h"
-#include "noperserv_db.h"
-#include "noperserv_hooks.h"
-#include "noperserv_policy.h"
+#include "../control/control.h"
+#include "../control/control_db.h"
+#include "../control/control_policy.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -27,146 +26,14 @@ MODULE_VERSION("");
 #define NO_FOUND_NICKNAME 1
 #define NO_FOUND_AUTHNAME 2
 
-int noperserv_ext;
-
-const flag no_commandflags[] = {
-    { 'o', __NO_OPER },
-    { 't', __NO_TRUST },
-    { 's', __NO_STAFF },
-    { 'S', __NO_SEC },
-    { 'd', __NO_DEVELOPER },
-    { 'L', __NO_LEGACY },
-    { 'O', __NO_OPERED },
-    { 'r', __NO_AUTHED },
-    { 'R', __NO_ACCOUNT },
-    { 'Y', __NO_RELAY },
-    { '\0', 0 }
-  }; 
-
-const flag no_userflags[] = {
-    { 'o', __NO_OPER },
-    { 't', __NO_TRUST },
-    { 's', __NO_STAFF },
-    { 'S', __NO_SEC },
-    { 'd', __NO_DEVELOPER },
-    { 'Y', __NO_RELAY },
-    { '\0', 0 }
-  }; 
-
-const flag no_noticeflags[] = {
-    { 'm', NL_MANAGEMENT },   /* hello, password, userflags, noticeflags */
-    { 't', NL_TRUSTS },       /* trust stuff... */
-    { 'k', NL_KICKKILLS },    /* KICK/KILL commands */
-    { 'I', NL_MISC },         /* misc commands */
-    { 'g', NL_GLINES },       /* GLINE commands */
-    { 'G', NL_GLINES_AUTO },  /* automated gline messages */
-    { 'h', NL_HITS },         /* Where a gline or kill is set automatically by the bot */
-    { 'c', NL_CLONING },      /* Clone detection */
-    { 'C', NL_CLEARCHAN },    /* When someone clearchans */
-    { 'f', NL_FAKEUSERS },    /* Fakeuser addition */
-    { 'b', NL_BROADCASTS },   /* Broadcast/mbroadcast/sbroadcast */
-    { 'o', NL_OPERATIONS },   /* insmod/rmmod/etc */
-    { 'O', NL_OPERING },      /* when someone opers */
-    { 'n', NL_NOTICES },      /* turn off to receive notices instead of privmsgs */
-    { 'A', NL_ALL_COMMANDS }, /* all commands sent */
-    { '\0', 0 }
-  };
-
-int noperserv_hello(void *sender, int cargc, char **cargv);
-int noperserv_noticeflags(void *sender, int cargc, char **cargv);
-int noperserv_userflags(void *sender, int cargc, char **cargv);
-int noperserv_deluser(void *sender, int cargc, char **cargv);
-void noperserv_oper_detection(int hooknum, void *arg);
-void noperserv_reply(nick *np, char *format, ...) __attribute__ ((format (printf, 2, 3)));
-
-int init = 0;
-
-void _init() {
-  if(!noperserv_load_db())
-    return;
-
-  noperserv_ext = registernickext("noperserv");
-
-  noperserv_setup_hooks();
-
-  registercontrolhelpcmd("hello", NO_OPERED | NO_AUTHED, 1, &noperserv_hello, "Syntax: HELLO ?nickname|#authname?\nCreates an account on the service for the specified nick, or if one isn't supplied, your nickname.");
-  registercontrolhelpcmd("userflags", NO_ACCOUNT, 2, &noperserv_userflags,
-    "Syntax: USERFLAGS <nickname|#authname> ?modifications?\n"
-    " Views and modifies user permissions.\n"
-    " If no nickname or authname is supplied, you are substituted for it.\n"
-    " If no flags are supplied, flags are just displayed instead of modified."
-    " Flags:\n"
-    "  +o: Operator\n"
-    "  +s: Staff member\n"
-    "  +S: Security team member\n"
-    "  +d: NOperserv developer\n"
-    "  +t: Trust queue worker\n"
-    "  +Y: Relay\n"
-    " Additional flags may show up in SHOWCOMMANDS but are not userflags as such:\n"
-    "  +r: Authed user\n"
-    "  +R: Registered NOperserv user\n"
-    "  +O: Must be /OPER'ed\n"
-    "  +L: Legacy command\n"
-  );
-  registercontrolhelpcmd("noticeflags", NO_ACCOUNT, 1, &noperserv_noticeflags,
-    "Syntax: NOTICEFLAGS ?(nickname|#authname)|flags?\n"
-    " This command can view and modify your own notice flags, and view that of other users.\n"
-    " Flags:\n"
-    "  +m: Management (hello, password, userflags, noticeflags)\n"
-    "  +t: Trusts\n"
-    "  +k: KICK/KILL commands\n"
-    "  +g: GLINE commands\n"
-    "  +G: automated gline messages\n"
-    "  +h: Shows when glines are set by code (hits)\n"
-    "  +c: Clone information\n"
-    "  +C: CLEARCHAN command\n"
-    "  +f: FAKEUSER commands\n"
-    "  +b: BROADCAST commands\n"
-    "  +o: Operation commands, such as insmod, rmmod, die, etc\n"
-    "  +O: /OPER\n"
-    "  +I: Misc commands (resync, etc)\n"
-    "  +n: Sends notices instead of privmsgs\n"
-    "  +A: Every single command sent to the service (spammy)\n"
-  );
-
-  registercontrolhelpcmd("deluser", NO_OPERED | NO_ACCOUNT, 2, &noperserv_deluser, "Syntax: DELUSER <nickname|#authname>\nDeletes the specified user.");
-  registerhook(HOOK_NICK_MODEOPER, &noperserv_oper_detection);
-
-  init = 1;
-}
-
-#ifdef BROKEN_DLCLOSE
-void __fini() {
-#else
-void _fini() {
-#endif
-  if(!init)
-    return;
-
-  deregisterhook(HOOK_NICK_MODEOPER, &noperserv_oper_detection);
-
-  deregistercontrolcmd("noticeflags", &noperserv_noticeflags);
-  deregistercontrolcmd("userflags", &noperserv_userflags);
-  deregistercontrolcmd("noticeflags", &noperserv_noticeflags);
-  deregistercontrolcmd("hello", &noperserv_hello);
-  deregistercontrolcmd("deluser", &noperserv_deluser);
-
-  noperserv_cleanup_hooks();
-
-  noperserv_cleanup_db();
-
-  releasenickext(noperserv_ext);
-}
-
 /* @test */
-int noperserv_hello(void *sender, int cargc, char **cargv) {
-  char *newaccount = NULL;
+static int noperserv_hello(void *sender, int cargc, char **cargv) {
+  authname *newaccount = NULL;
   no_autheduser *au;
-  int i;
   nick *np = (nick *)sender, *np2, *target = NULL;
 
   if(cargc == 0) {
-    newaccount = np->authname;
+    newaccount = np->auth;
   } else {
     if(cargv[0][0] == '#') {
       authname *a = getauthbyname(cargv[0] + 1);
@@ -174,27 +41,27 @@ int noperserv_hello(void *sender, int cargc, char **cargv) {
         controlreply(np, "Cannot find anyone with that authname on the network.");
         return CMD_ERROR;
       }
-      newaccount = a->name;
+      newaccount = a;
     } else {
       target = getnickbynick(cargv[0]);
       if(!target) {
         controlreply(np, "Supplied nickname is not on the network.");
         return CMD_ERROR;
       }
-      if(!IsAccount(target)) {
-        controlreply(np, "Supplied user is not authed with the network.");
-        return CMD_ERROR;
-      }
-      newaccount = target->authname;
+      newaccount = target->auth;
     }
   }
+  if(!newaccount) {
+    controlreply(np, "Supplied user is not authed with the network.");
+    return CMD_ERROR;
+  }
   au = noperserv_get_autheduser(newaccount);
   if(au) {
     controlreply(np, "Authname already registered.");  
     return CMD_ERROR;
   }
 
-  au = noperserv_new_autheduser(newaccount);
+  au = noperserv_new_autheduser(newaccount->userid, newaccount->name);
   if(!au) {
     controlreply(np, "Memory allocation error.");
     return CMD_ERROR;
@@ -208,53 +75,55 @@ int noperserv_hello(void *sender, int cargc, char **cargv) {
     au->noticelevel = NO_DEFAULT_NOTICELEVEL;
   }
 
-  au->id = noperserv_next_autheduser_id();
   noperserv_update_autheduser(au);
 
-  for(i=0;i<NICKHASHSIZE;i++)
-    for(np2=nicktable[i];np2;np2=np2->next)
-      if(IsAccount(np2) && !ircd_strcmp(newaccount, np2->authname)) {
-        noperserv_add_to_autheduser(np2, au);
-        controlreply(np2, "An account has been created for you (auth %s).", au->authname->content);
-        if(NOGetAuthLevel(au))
-          controlreply(np2, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
-        controlreply(np2, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
-      }
+  for(np2=newaccount->nicks;np2;np2=np2->nextbyauthname) {
+    controlreply(np2, "An account has been created for you (auth %s).", au->authname->name);
+    if(NOGetAuthLevel(au))
+      controlreply(np2, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
+    controlreply(np2, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
+  }
 
-  if(ircd_strcmp(np->authname, newaccount)) { /* send a message to the person who HELLO'ed if we haven't already been told */
-    controlreply(np, "Account created for auth %s.", au->authname->content);
+  if(np->auth==newaccount) { /* send a message to the person who HELLO'ed if we haven't already been told */
+    controlreply(np, "Account created for auth %s.", au->authname->name);
     if(NOGetAuthLevel(au))
       controlreply(np, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
     controlreply(np, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
     controlreply(np, "Instructions sent to all authed users.");
-  } else if(au->nick && au->nick->next) { /* if we have already been told, tell the user it was sent to more than themselves */
+  } else if(newaccount->nicks && newaccount->nicks->next) { /* if we have already been told, tell the user it was sent to more than themselves */
     controlreply(np, "Instructions sent to all authed users.");
   }
 
-  controlwall(NO_OPERED, NL_MANAGEMENT, "%s/%s just HELLO'ed: %s", np->nick, np->authname, au->authname->content);
+  controlwall(NO_OPERED, NL_MANAGEMENT, "%s/%s just HELLO'ed: %s", np->nick, np->authname, au->authname->name);
   return CMD_OK;
 }
 
-no_autheduser *noperserv_autheduser_from_command(nick *np, char *command, int *typefound, char **returned) {
+static no_autheduser *noperserv_autheduser_from_command(nick *np, char *command, int *typefound, char **returned) {
   no_autheduser *au;
+  authname *anp;
   if(command[0] == '#') {
-    au = noperserv_get_autheduser(command + 1);
+    anp = findauthnamebyname(command + 1);
+    if(!anp) {
+      controlreply(np, "Authname not found.");
+      return NULL;
+    }
+    au = noperserv_get_autheduser(anp);
     if(!au) {
       controlreply(np, "Authname not found.");
     } else {
       *typefound = NO_FOUND_AUTHNAME;
-      *returned = au->authname->content;
+      *returned = au->authname->name;
       return au;
     }
   } else {
     nick *np2 = getnickbynick(command);
     if(!np2) {
       controlreply(np, "Nickname not on the network.");
-      return CMD_OK;
+      return NULL;
     }
     if(!IsAccount(np2)) {
       controlreply(np, "User is not authed with the network.");
-      return CMD_OK;
+      return NULL;
     }
     au = NOGetAuthedUser(np2);
     if(!au) {
@@ -269,8 +138,8 @@ no_autheduser *noperserv_autheduser_from_command(nick *np, char *command, int *t
   return NULL;
 }
 
-int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+static int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
+  nick *np2, *np = (nick *)sender;
   no_autheduser *au;
 
   if(cargc == 1) {
@@ -300,7 +169,6 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
             controlreply(np, "No changes made to existing flags.");
           } else {
             char ourflags[FLAGBUFLEN], ournoticeflags[FLAGBUFLEN], diff[FLAGBUFLEN * 2 + 1], finalflags[FLAGBUFLEN];
-            no_nicklist *nl = au->nick;
             noperserv_update_autheduser(au);
             controlreply(np, "Flag alterations complete.");
 
@@ -310,10 +178,10 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
             controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used NOTICEFLAGS (%s): %s", np->nick, np->authname, ourflags, ournoticeflags, diff);
 
             strlcpy(finalflags, printflags(NOGetNoticeLevel(au), no_noticeflags), sizeof(finalflags));
-            for(;nl;nl=nl->next)
-              if(nl->nick != np) {
-                controlreply(nl->nick, "!!! %s just used NOTICEFLAGS (%s): %s", np->nick, ournoticeflags, diff);
-                controlreply(nl->nick, "Your notice flags are %s", finalflags);
+            for(np2=au->authname->nicks;np2;np2=np2->nextbyauthname)
+              if(np2 != np) {
+                controlreply(np2, "!!! %s just used NOTICEFLAGS (%s): %s", np->nick, ournoticeflags, diff);
+                controlreply(np2, "Your notice flags are %s", finalflags);
               }
           }
         }
@@ -346,12 +214,11 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
 }
 
 /* @test */
-int noperserv_deluser(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+static int noperserv_deluser(void *sender, int cargc, char **cargv) {
+  nick *np2, *np = (nick *)sender;
   no_autheduser *target /* target user */, *au = NOGetAuthedUser(np); /* user executing command */
   char *userreturned = NULL; /* nickname or authname of the target, pulled from the db */
   int typefound; /* whether it was an authname or a username */
-  no_nicklist *nl;
   char targetflags[FLAGBUFLEN], ourflags[FLAGBUFLEN], deleteduser[NOMax(ACCOUNTLEN, NICKLEN) + 1];
 
   if(cargc != 1)
@@ -371,18 +238,18 @@ int noperserv_deluser(void *sender, int cargc, char **cargv) {
      to modify, if we have no flags we won't be able to delete ourselves */
   if((target != au) && !noperserv_policy_permitted_modifications(au, target)) {
     controlreply(np, "Deletion denied."); 
-    controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to DELUSER %s (%s)", np->nick, np->authname, ourflags, target->authname->content, targetflags);
+    controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to DELUSER %s (%s)", np->nick, np->authname, ourflags, target->authname->name, targetflags);
 
     return CMD_ERROR;
   }
 
-  for(nl=target->nick;nl;nl=nl->next)
-    if(nl->nick != np)
-      controlreply(nl->nick, "!!! %s/%s (%s) just DELUSERed you.", np->nick, np->authname, ourflags);
+  for(np2=target->authname->nicks;np2;np2=np2->nextbyauthname)
+    if(np2 != np)
+      controlreply(np2, "!!! %s/%s (%s) just DELUSERed you.", np->nick, np->authname, ourflags);
 
   noperserv_delete_autheduser(target);
 
-  controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used DELUSER on %s (%s)", np->nick, np->authname, ourflags, target->authname->content, targetflags);
+  controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used DELUSER on %s (%s)", np->nick, np->authname, ourflags, deleteduser, targetflags);
 
   if(target == au) {
     controlreply(np, "You have been deleted.");
@@ -395,8 +262,8 @@ int noperserv_deluser(void *sender, int cargc, char **cargv) {
 
 /* @test */
 /* this command needs LOTS of checking */
-int noperserv_userflags(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+static int noperserv_userflags(void *sender, int cargc, char **cargv) {
+  nick *np2, *np = (nick *)sender;
   no_autheduser *au = NOGetAuthedUser(np), *target = NULL;
   char *flags = NULL, *nicktarget = NULL;
   int typefound;
@@ -441,7 +308,7 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           strlcpy(targetflags, printflags(fwas, no_userflags), sizeof(targetflags));
           strlcpy(ourflags, printflags(fours, no_userflags), sizeof(ourflags));
 
-          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to use USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->content, targetflags, printflagdiff(fwas, fnow, no_userflags));
+          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to use USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->name, targetflags, printflagdiff(fwas, fnow, no_userflags));
           return CMD_ERROR;
         }
       } else if(ret == REJECT_NONE) {
@@ -449,7 +316,6 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           controlreply(np, "No changes made to existing flags.");
         } else {
           char targetflags[FLAGBUFLEN], ourflags[FLAGBUFLEN], finalflags[FLAGBUFLEN];
-          no_nicklist *nl = target->nick;
 
           noperserv_policy_update_noticeflags(fwas, target);          
           noperserv_update_autheduser(target);
@@ -459,14 +325,14 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           strlcpy(targetflags, printflags(fwas, no_userflags), sizeof(targetflags));
           strlcpy(ourflags, printflags(fours, no_userflags), sizeof(ourflags));
 
-          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->content, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
+          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->name, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
 
           strlcpy(finalflags, printflags(NOGetAuthLevel(target), no_userflags), sizeof(finalflags));
-          for(;nl;nl=nl->next)
-            if(nl->nick != np) {
-              controlreply(nl->nick, "!!! %s/%s (%s) just used USERFLAGS on you (%s): %s", np->nick, np->authname, ourflags, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
-              controlreply(nl->nick, "Your user flags are now: %s", finalflags);
-              controlreply(nl->nick, "Your notice flags are now: %s", printflags(target->noticelevel, no_noticeflags));
+          for(np2=target->authname->nicks;np2;np2=np2->nextbyauthname)
+            if(np2 != np) {
+              controlreply(np2, "!!! %s/%s (%s) just used USERFLAGS on you (%s): %s", np->nick, np->authname, ourflags, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
+              controlreply(np2, "Your user flags are now: %s", finalflags);
+              controlreply(np2, "Your notice flags are now: %s", printflags(target->noticelevel, no_noticeflags));
             }
         }
       }
@@ -487,16 +353,55 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
   return CMD_OK;
 }
 
-void noperserv_oper_detection(int hooknum, void *arg) {
-  nick *np = (nick *)arg;
+void _init() {
+  registercontrolhelpcmd("hello", NO_OPERED | NO_AUTHED, 1, &noperserv_hello, "Syntax: HELLO ?nickname|#authname?\nCreates an account on the service for the specified nick, or if one isn't supplied, your nickname.");
+  registercontrolhelpcmd("userflags", NO_ACCOUNT, 2, &noperserv_userflags,
+    "Syntax: USERFLAGS <nickname|#authname> ?modifications?\n"
+    " Views and modifies user permissions.\n"
+    " If no nickname or authname is supplied, you are substituted for it.\n"
+    " If no flags are supplied, flags are just displayed instead of modified."
+    " Flags:\n"
+    "  +o: Operator\n"
+    "  +s: Staff member\n"
+    "  +S: Security team member\n"
+    "  +d: NOperserv developer\n"
+    "  +t: Trust queue worker\n"
+    "  +Y: Relay\n"
+    " Additional flags may show up in SHOWCOMMANDS but are not userflags as such:\n"
+    "  +r: Authed user\n"
+    "  +R: Registered NOperserv user\n"
+    "  +O: Must be /OPER'ed\n"
+    "  +L: Legacy command\n"
+  );
+  registercontrolhelpcmd("noticeflags", NO_ACCOUNT, 1, &noperserv_noticeflags,
+    "Syntax: NOTICEFLAGS ?(nickname|#authname)|flags?\n"
+    " This command can view and modify your own notice flags, and view that of other users.\n"
+    " Flags:\n"
+    "  +m: Management (hello, password, userflags, noticeflags)\n"
+    "  +t: Trusts\n"
+    "  +k: KICK/KILL commands\n"
+    "  +g: GLINE commands\n"
+    "  +G: automated gline messages\n"
+    "  +h: Shows when glines are set by code (hits)\n"
+    "  +c: Clone information\n"
+    "  +C: CLEARCHAN command\n"
+    "  +f: FAKEUSER commands\n"
+    "  +b: BROADCAST commands\n"
+    "  +o: Operation commands, such as insmod, rmmod, die, etc\n"
+    "  +O: /OPER\n"
+    "  +I: Misc commands (resync, etc)\n"
+    "  +n: Sends notices instead of privmsgs\n"
+    "  +A: Every single command sent to the service (spammy)\n"
+  );
+
+  registercontrolhelpcmd("deluser", NO_OPERED | NO_ACCOUNT, 2, &noperserv_deluser, "Syntax: DELUSER <nickname|#authname>\nDeletes the specified user.");
+}
 
-  if(np->umodes & UMODE_OPER) {
-    if(np->opername && strcmp(np->opername->content, "-")) {
-      controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just OPERed as %s", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"", np->opername->content);
-    } else {
-      controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just OPERed", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"");
-    }
-  } else {
-    controlwall(NO_OPER, NL_OPERING, "%s!%s@%s%s%s just DEOPERed", np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"");
-  }
+void _fini() {
+  deregistercontrolcmd("noticeflags", &noperserv_noticeflags);
+  deregistercontrolcmd("userflags", &noperserv_userflags);
+  deregistercontrolcmd("noticeflags", &noperserv_noticeflags);
+  deregistercontrolcmd("hello", &noperserv_hello);
+  deregistercontrolcmd("deluser", &noperserv_deluser);
 }
+
similarity index 96%
rename from noperserv/noperserv_policy.c
rename to control/control_policy.c
index b80ac1edfc17cb60989b912613ec6bec08df715d..17c173bcc8529ab1c2f57e7a0d7a6ca6d0035089 100644 (file)
@@ -1,7 +1,6 @@
-#include "../control/control.h"
-#include "noperserv.h"
-#include "noperserv_db.h"
-#include "noperserv_policy.h"
+#include "control.h"
+#include "control_db.h"
+#include "control_policy.h"
 
 /* command access */
 int noperserv_policy_command_permitted(flag_t level, nick *user) {
index e958c9f034c651297391b8fe96093c8473087426..dfbd7dfe234c366800d6edd1b20cc26e48870219 100644 (file)
@@ -13,6 +13,9 @@
 #include <string.h>
 #include <time.h>
 #include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <errno.h>
 #include <signal.h>
 #include <unistd.h>
 
@@ -56,6 +59,12 @@ int main(int argc, char **argv) {
 
   initconfig(config);
 
+  /* modules can rely on this directory always being there */
+  if (mkdir("data", 0700) < 0 && errno != EEXIST) {
+    perror("mkdir");
+    return 1;
+  }
+
   /* Loading the modules will bring in the bulk of the code */
   initmodules();
   signal(SIGINT, siginthandler);
index e5103c5c6b6a9f09cec0933ff54f6accf7a4e1f7..433fe7c052383799560af0b2523f7f797bf754a3 100644 (file)
@@ -71,13 +71,13 @@ int setflags(flag_t *inflags, flag_t flagmask, char *flagstr, const flag *flagsl
  *  Prints out which flags are currently set in a flag block
  */
 char *printflags(flag_t inflags, const flag *flaglist) {
-  static char buf[18];
+  static char buf[34];
   int i;
   char *ch=buf;
   
   *ch++='+';
   
-  for (i=0;flaglist[i].flagchar!='\0' && i<16;i++) {
+  for (i=0;flaglist[i].flagchar!='\0' && i<32;i++) {
     if (inflags&flaglist[i].flagbit) {
       *ch++=flaglist[i].flagchar;
     }
@@ -92,13 +92,13 @@ char *printflags(flag_t inflags, const flag *flaglist) {
  *  Prints out which flags are currently set in a flag block, or return "none"
  */
 char *printflagsornone(flag_t inflags, const flag *flaglist) {
-  static char buf[18];
+  static char buf[34];
   int i;
   char *ch=buf;
   
   *ch++='+';
   
-  for (i=0;flaglist[i].flagchar!='\0' && i<16;i++) {
+  for (i=0;flaglist[i].flagchar!='\0' && i<32;i++) {
     if (inflags&flaglist[i].flagbit) {
       *ch++=flaglist[i].flagchar;
     }
@@ -113,11 +113,11 @@ char *printflagsornone(flag_t inflags, const flag *flaglist) {
 /* ugh */
 
 char *printflags_noprefix(flag_t inflags, const flag *flaglist) {
-  static char buf[18];
+  static char buf[34];
   int i;
   char *ch=buf;
   
-  for (i=0;flaglist[i].flagchar!='\0' && i<16;i++) {
+  for (i=0;flaglist[i].flagchar!='\0' && i<32;i++) {
     if (inflags&flaglist[i].flagbit) {
       *ch++=flaglist[i].flagchar;
     }
@@ -135,14 +135,14 @@ char *printflags_noprefix(flag_t inflags, const flag *flaglist) {
  */
 
 char *printflagdiff(flag_t oldflags, flag_t newflags, const flag *flaglist) {
-  static char buf[30];
+  static char buf[40];
   int i;
   char *ch=buf;
   int chd=0;
  
   /* Removes first */
 
-  for (i=0;flaglist[i].flagchar!='\0' && i<16;i++) {
+  for (i=0;flaglist[i].flagchar!='\0' && i<32;i++) {
     if ((oldflags & flaglist[i].flagbit) && !(newflags & flaglist[i].flagbit)) {
       if (chd==0) {
         chd=1;
@@ -155,7 +155,7 @@ char *printflagdiff(flag_t oldflags, flag_t newflags, const flag *flaglist) {
   /* Now adds */
   chd=0;
 
-  for (i=0;flaglist[i].flagchar!='\0' && i<16;i++) {
+  for (i=0;flaglist[i].flagchar!='\0' && i<32;i++) {
     if (!(oldflags & flaglist[i].flagbit) && (newflags & flaglist[i].flagbit)) {
       if (chd==0) {
        chd=1;
index c91ac9e9c630d346b9c9a3c3e477664034e3842c..d8a9b87c1d6b46850f0a8b833f56649a96df4ca6 100644 (file)
@@ -456,7 +456,7 @@ int parseopts(int cargc, char **cargv, int *arg, int *limit, void **subset, void
   return CMD_OK;
 }
 
-void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc replyfn, wallFunc wallfn, void *arg, searchCmd *cmd, nick *np, void *displayfn, int limit) {
+void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc replyfn, wallFunc wallfn, void *arg, searchCmd *cmd, nick *np, void *displayfn, int limit, void *target) {
   memset(ctx, 0, sizeof(searchCtx));
   
   ctx->reply = replyfn;
@@ -466,6 +466,7 @@ void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc reply
   ctx->searchcmd = cmd;
   ctx->sender = np;
   ctx->limit = limit;
+  ctx->target = target;
   ctx->displayfn = displayfn;
 }
 
@@ -502,7 +503,7 @@ int do_nicksearch_real(replyFunc reply, wallFunc wall, void *source, int cargc,
     return CMD_ERROR;
   }
 
-  ast_nicksearch(tree->root, reply, sender, wall, display, NULL, NULL, limit);
+  ast_nicksearch(tree->root, reply, sender, wall, display, NULL, NULL, limit, NULL);
 
   parse_free(tree);
 
@@ -531,7 +532,7 @@ void nicksearch_exe(struct searchNode *search, searchCtx *ctx) {
   search=coerceNode(ctx, search, RETURNTYPE_BOOL);
   
   for (i=0;i<NICKHASHSIZE;i++) {
-    for (np=nicktable[i];np;np=np->next) {
+    for (np=ctx->target ? ctx->target : nicktable[i];np;np=np->next) {
       if ((search->exe)(ctx, search, np)) {
         /* Add total channels */
         tchans += np->channels->cursi;
@@ -552,9 +553,13 @@ void nicksearch_exe(struct searchNode *search, searchCtx *ctx) {
          ctx->reply(sender, "--- More than %d matches, skipping the rest",limit);
        matches++;
       }
+
+      if (ctx->target)
+        goto done;
     }
   }
 
+done:
   ctx->reply(sender,"--- End of list: %d matches; users were on %u channels (%u unique, %.1f average clones)", 
                 matches, tchans, uchans, (float)tchans/uchans);
 }
@@ -592,7 +597,7 @@ int do_whowassearch_real(replyFunc reply, wallFunc wall, void *source, int cargc
     return CMD_ERROR;
   }
 
-  ast_whowassearch(tree->root, reply, sender, wall, display, NULL, NULL, limit);
+  ast_whowassearch(tree->root, reply, sender, wall, display, NULL, NULL, limit, NULL);
 
   parse_free(tree);
 
@@ -615,10 +620,14 @@ void whowassearch_exe(struct searchNode *search, searchCtx *ctx) {
   search=coerceNode(ctx, search, RETURNTYPE_BOOL);
 
   for (i = whowasoffset; i < whowasoffset + WW_MAXENTRIES; i++) {
-    ww = &whowasrecs[i % WW_MAXENTRIES];
+    if (ctx->target) {
+      ww = ctx->target;
+    } else {
+      ww = &whowasrecs[i % WW_MAXENTRIES];
 
-    if (ww->type == WHOWAS_UNUSED)
-      continue;
+      if (ww->type == WHOWAS_UNUSED)
+        continue;
+    }
 
     /* Note: We're passing the nick to the filter function. The original
      * whowas record is in the nick's ->next field. */
@@ -630,6 +639,9 @@ void whowassearch_exe(struct searchNode *search, searchCtx *ctx) {
         ctx->reply(sender, "--- More than %d matches, skipping the rest",limit);
       matches++;
     }
+
+    if (ctx->target)
+      break;
   }
 
   ctx->reply(sender,"--- End of list: %d matches", matches);
@@ -668,7 +680,7 @@ int do_chansearch_real(replyFunc reply, wallFunc wall, void *source, int cargc,
     return CMD_ERROR;
   }
 
-  ast_chansearch(tree->root, reply, sender, wall, display, NULL, NULL, limit);
+  ast_chansearch(tree->root, reply, sender, wall, display, NULL, NULL, limit, NULL);
 
   parse_free(tree);
 
@@ -691,17 +703,21 @@ void chansearch_exe(struct searchNode *search, searchCtx *ctx) {
   search=coerceNode(ctx, search, RETURNTYPE_BOOL);
   
   for (i=0;i<CHANNELHASHSIZE;i++) {
-    for (cip=chantable[i];cip;cip=cip->next) {
+    for (cip=ctx->target ? ctx->target : chantable[i];cip;cip=cip->next) {
       if ((search->exe)(ctx, search, cip)) {
        if (matches<limit)
          display(ctx, sender, cip);
        if (matches==limit)
          ctx->reply(sender, "--- More than %d matches, skipping the rest",limit);
        matches++;
+
+        if (ctx->target)
+          goto done;
       }
     }
   }
 
+done:
   ctx->reply(sender,"--- End of list: %d matches", matches);
 }
 
@@ -738,7 +754,7 @@ int do_usersearch_real(replyFunc reply, wallFunc wall, void *source, int cargc,
     return CMD_ERROR;
   }
 
-  ast_usersearch(tree->root, reply, sender, wall, display, NULL, NULL, limit);
+  ast_usersearch(tree->root, reply, sender, wall, display, NULL, NULL, limit, NULL);
 
   parse_free(tree);
 
@@ -761,7 +777,7 @@ void usersearch_exe(struct searchNode *search, searchCtx *ctx) {
   search=coerceNode(ctx, search, RETURNTYPE_BOOL);
   
   for (i=0;i<AUTHNAMEHASHSIZE;i++) {
-    for (aup=authnametable[i];aup;aup=aup->next) {
+    for (aup=ctx->target ? ctx->target : authnametable[i];aup;aup=aup->next) {
       if ((search->exe)(ctx, search, aup)) {
        if (matches<limit)
          display(ctx, sender, aup);
@@ -769,9 +785,13 @@ void usersearch_exe(struct searchNode *search, searchCtx *ctx) {
          ctx->reply(sender, "--- More than %d matches, skipping the rest",limit);
        matches++;
       }
+
+      if (ctx->target)
+        goto done;
     }
   }
 
+done:
   ctx->reply(sender,"--- End of list: %d matches", matches);
 }
 
index 67ebe1165249b322a556004276fd95fbbed64f43..7e14e030713f3c50dc57b0792f9da5f0aff5c646 100644 (file)
@@ -92,6 +92,7 @@ typedef struct searchCtx {
   struct searchCmd *searchcmd;
   nick *sender;
   int limit;
+  void *target;
   void *displayfn;
 } searchCtx;
 
@@ -220,7 +221,7 @@ struct searchVariable *var_register(searchCtx *ctx, char *arg, int type);
 searchNode *var_get(searchCtx *ctx, char *arg);
 void var_setstr(struct searchVariable *v, char *data);
 
-void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc replyfn, wallFunc wallfn, void *arg, searchCmd *cmd, nick *sender, void *displayfn, int limit);
+void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc replyfn, wallFunc wallfn, void *arg, searchCmd *cmd, nick *sender, void *displayfn, int limit, void *target);
 
 /* AST functions */
 
@@ -271,16 +272,16 @@ typedef struct searchASTCache {
 
 searchNode *search_astparse(searchCtx *, char *);
 
-int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit);
-int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit);
-int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit);
-int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, WhowasDisplayFunc display, HeaderFunc header, void *headerarg, int limit);
+int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit, nick *);
+int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit, chanindex *);
+int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit, authname *);
+int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, WhowasDisplayFunc display, HeaderFunc header, void *headerarg, int limit, whowas *);
 
 char *ast_printtree(char *buf, size_t bufsize, searchASTExpr *expr, searchCmd *cmd);
 
 int parseopts(int cargc, char **cargv, int *arg, int *limit, void **subset, void *display, CommandTree *sl, replyFunc reply, void *sender);
 
-typedef int (*ASTFunc)(searchASTExpr *, replyFunc, void *, wallFunc, void *, HeaderFunc, void *, int limit);
+typedef int (*ASTFunc)(searchASTExpr *, replyFunc, void *, wallFunc, void *, HeaderFunc, void *, int limit, void *target);
 
 /* erk */
 extern searchList *globalterms;
index d77f0a215bb443b04db79888568d6ffb95f6da70..7eefed0082985b6a9469a07264c79826b1d0007b 100644 (file)
@@ -127,7 +127,7 @@ searchNode *search_astparse(searchCtx *ctx, char *loc) {
   }
 }
 
-int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit, nick *target) {
   searchCtx ctx;
   searchASTCache cache;
   searchNode *search;
@@ -136,7 +136,7 @@ int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc
   memset(&cache, 0, sizeof(cache));
   cache.tree = tree;
 
-  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch, sender, display, limit);
+  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch, sender, display, limit, target);
 
   buf[0] = '\0';
   reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_nicksearch));
@@ -156,7 +156,7 @@ int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc
   return CMD_OK;
 }
 
-int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, WhowasDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, WhowasDisplayFunc display, HeaderFunc header, void *headerarg, int limit, whowas *target) {
   searchCtx ctx;
   searchASTCache cache;
   searchNode *search;
@@ -165,7 +165,7 @@ int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFun
   memset(&cache, 0, sizeof(cache));
   cache.tree = tree;
 
-  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_whowassearch, sender, display, limit);
+  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_whowassearch, sender, display, limit, target);
 
   buf[0] = '\0';
   reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_whowassearch));
@@ -185,13 +185,13 @@ int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFun
   return CMD_OK;
 }
 
-int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit, chanindex *target) {
   searchCtx ctx;
   searchASTCache cache;
   searchNode *search;
   char buf[1024];
 
-  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch, sender, display, limit);
+  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch, sender, display, limit, target);
 
   memset(&cache, 0, sizeof(cache));
   cache.tree = tree;
@@ -214,7 +214,7 @@ int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc
   return CMD_OK;
 }
 
-int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit, authname *target) {
   searchCtx ctx;
   searchASTCache cache;
   searchNode *search;
@@ -223,7 +223,7 @@ int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc
   memset(&cache, 0, sizeof(cache));
   cache.tree = tree;
 
-  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch, sender, display, limit);
+  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch, sender, display, limit, target);
 
   buf[0] = '\0';
   reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_usersearch));
index 0235fa7419ca291191537bf71a2aab4b6f6e6e8b..b08e854a732fd00dab86719bb33a11be453c3238 100644 (file)
@@ -38,6 +38,8 @@ const flag umodeflags[] = {
    { 'R', UMODE_REGPRIV },
    { 'I', UMODE_HIDEIDLE },
    { 'P', UMODE_PARANOID },
+   { 'q', UMODE_COMCHANS },
+   { 'Q', UMODE_COMCHANSRESTR },
    { 'C', UMODE_CLOAKED },
    { '\0', 0 } };
 
index 4149a1aecbeeaef35840038a7d6fce86cd968748..2efadf30dfb12ae7b28bfaadf7cd5e0abc734fb3 100644 (file)
 #define UMODE_HIDEIDLE  0x1000
 #define UMODE_PARANOID  0x2000
 #define UMODE_CLOAKED   0x4000
+#define UMODE_COMCHANS  0x8000
+#define UMODE_COMCHANSRESTR 0x10000
 
-#define UMODE_ALL       0x7FFF
+#define UMODE_ALL       0x1FFFF
 
 #define AFLAG_STAFF     0x0001
 #define AFLAG_SUPPORT   0x0002
 
 #define AFLAG_ALL       0x001F
 
-#define IsInvisible(x)    ((x)->umodes & UMODE_INV)
-#define IsWallops(x)      ((x)->umodes & UMODE_WALLOPS)
-#define IsDebug(x)        ((x)->umodes & UMODE_DEBUG)
-#define IsOper(x)         ((x)->umodes & UMODE_OPER)
-#define IsService(x)      ((x)->umodes & UMODE_SERVICE)
-#define IsXOper(x)        ((x)->umodes & UMODE_XOPER)
-#define IsDeaf(x)         ((x)->umodes & UMODE_DEAF)
-#define IsAccount(x)      ((x)->umodes & UMODE_ACCOUNT)
-#define IsHideChan(x)     ((x)->umodes & UMODE_HIDECHAN)
-#define IsHideHost(x)     ((x)->umodes & UMODE_HIDEHOST)
-#define IsSetHost(x)      ((x)->umodes & UMODE_SETHOST)
-#define IsRegPriv(x)      ((x)->umodes & UMODE_REGPRIV)
-#define IsHideIdle(x)     ((x)->umodes & UMODE_HIDEIDLE)
-#define IsParanoid(x)     ((x)->umodes & UMODE_PARANOID)
-#define IsCloaked(x)      ((x)->umodes & UMODE_CLOAKED)
-
-#define SetInvisible(x)    ((x)->umodes |= UMODE_INV)
-#define SetWallops(x)      ((x)->umodes |= UMODE_WALLOPS)
-#define SetDebug(x)        ((x)->umodes |= UMODE_DEBUG)
-#define SetOper(x)         ((x)->umodes |= UMODE_OPER)
-#define SetService(x)      ((x)->umodes |= UMODE_SERVICE)
-#define SetXOper(x)        ((x)->umodes |= UMODE_XOPER)
-#define SetDeaf(x)         ((x)->umodes |= UMODE_DEAF)
-#define SetAccount(x)      ((x)->umodes |= UMODE_ACCOUNT)
-#define SetHideChan(x)     ((x)->umodes |= UMODE_HIDECHAN)
-#define SetHideHost(x)     ((x)->umodes |= UMODE_HIDEHOST)
-#define SetSetHost(x)      ((x)->umodes |= UMODE_SETHOST)
-#define SetRegPriv(x)      ((x)->umodes |= UMODE_REGPRIV)
-#define SetHideIdle(x)     ((x)->umodes |= UMODE_HIDEIDLE)
-#define SetParanoid(x)     ((x)->umodes |= UMODE_PARANOID)
-#define SetCloaked(x)      ((x)->umodes |= UMODE_CLOAKED)
-
-#define ClearInvisible(x)    ((x)->umodes &= ~UMODE_INV)
-#define ClearWallops(x)      ((x)->umodes &= ~UMODE_WALLOPS)
-#define ClearDebug(x)        ((x)->umodes &= ~UMODE_DEBUG)
-#define ClearOper(x)         ((x)->umodes &= ~UMODE_OPER)
-#define ClearService(x)      ((x)->umodes &= ~UMODE_SERVICE)
-#define ClearXOper(x)        ((x)->umodes &= ~UMODE_XOPER)
-#define ClearDeaf(x)         ((x)->umodes &= ~UMODE_DEAF)
-#define ClearAccount(x)      ((x)->umodes &= ~UMODE_ACCOUNT)
-#define ClearHideChan(x)     ((x)->umodes &= ~UMODE_HIDECHAN)
-#define ClearHideHost(x)     ((x)->umodes &= ~UMODE_HIDEHOST)
-#define ClearSetHost(x)      ((x)->umodes &= ~UMODE_SETHOST)
-#define ClearRegPriv(x)      ((x)->umodes &= ~UMODE_REGPRIV)
-#define ClearHideIdle(x)     ((x)->umodes &= ~UMODE_HIDEIDLE)
-#define ClearParanoid(x)     ((x)->umodes &= ~UMODE_PARANOID)
-#define ClearCloaked(x)      ((x)->umodes &= ~UMODE_CLOAKED)
-
-#define IsStaff(x)           ((x)->flags & AFLAG_STAFF)
-#define IsDeveloper(x)       ((x)->flags & AFLAG_DEVELOPER)
-#define IsSupport(x)         ((x)->flags & AFLAG_SUPPORT)
-#define IsAdmin(x)           ((x)->flags & AFLAG_ADMIN)
-#define IsOperFlag(x)        ((x)->flags & AFLAG_OPER)
-
-#define SetStaff(x)          ((x)->flags |= AFLAG_STAFF)
-#define SetDeveloper(x)      ((x)->flags |= AFLAG_DEVELOPER)
-#define SetSupport(x)        ((x)->flags |= AFLAG_SUPPORT)
-#define SetAdmin(x)          ((x)->flags |= AFLAG_ADMIN)
-#define SetOperFlag(x)       ((x)->flags |= AFLAG_OPER)
-
-#define ClearStaff(x)        ((x)->flags &= ~AFLAG_STAFF)
-#define ClearDeveloper(x)    ((x)->flags &= ~AFLAG_DEVELOPER)
-#define ClearSupport(x)      ((x)->flags &= ~AFLAG_SUPPORT)
-#define ClearAdmin(x)        ((x)->flags &= ~AFLAG_ADMIN)
-#define ClearOperFlag(x)     ((x)->flags &= ~AFLAG_OPER)
+#define IsInvisible(x)        ((x)->umodes & UMODE_INV)
+#define IsWallops(x)          ((x)->umodes & UMODE_WALLOPS)
+#define IsDebug(x)            ((x)->umodes & UMODE_DEBUG)
+#define IsOper(x)             ((x)->umodes & UMODE_OPER)
+#define IsService(x)          ((x)->umodes & UMODE_SERVICE)
+#define IsXOper(x)            ((x)->umodes & UMODE_XOPER)
+#define IsDeaf(x)             ((x)->umodes & UMODE_DEAF)
+#define IsAccount(x)          ((x)->umodes & UMODE_ACCOUNT)
+#define IsHideChan(x)         ((x)->umodes & UMODE_HIDECHAN)
+#define IsHideHost(x)         ((x)->umodes & UMODE_HIDEHOST)
+#define IsSetHost(x)          ((x)->umodes & UMODE_SETHOST)
+#define IsRegPriv(x)          ((x)->umodes & UMODE_REGPRIV)
+#define IsHideIdle(x)         ((x)->umodes & UMODE_HIDEIDLE)
+#define IsParanoid(x)         ((x)->umodes & UMODE_PARANOID)
+#define IsComChans(x)         ((x)->umodes & UMODE_COMCHANS)
+#define IsComChansRestr(x)    ((x)->umodes & UMODE_COMCHANSRESTR)
+#define IsCloaked(x)          ((x)->umodes & UMODE_CLOAKED)
+
+#define SetInvisible(x)       ((x)->umodes |= UMODE_INV)
+#define SetWallops(x)         ((x)->umodes |= UMODE_WALLOPS)
+#define SetDebug(x)           ((x)->umodes |= UMODE_DEBUG)
+#define SetOper(x)            ((x)->umodes |= UMODE_OPER)
+#define SetService(x)         ((x)->umodes |= UMODE_SERVICE)
+#define SetXOper(x)           ((x)->umodes |= UMODE_XOPER)
+#define SetDeaf(x)            ((x)->umodes |= UMODE_DEAF)
+#define SetAccount(x)         ((x)->umodes |= UMODE_ACCOUNT)
+#define SetHideChan(x)        ((x)->umodes |= UMODE_HIDECHAN)
+#define SetHideHost(x)        ((x)->umodes |= UMODE_HIDEHOST)
+#define SetSetHost(x)         ((x)->umodes |= UMODE_SETHOST)
+#define SetRegPriv(x)         ((x)->umodes |= UMODE_REGPRIV)
+#define SetHideIdle(x)        ((x)->umodes |= UMODE_HIDEIDLE)
+#define SetParanoid(x)        ((x)->umodes |= UMODE_PARANOID)
+#define SetComChans(x)        ((x)->umodes |= UMODE_COMCHANS)
+#define SetComChansRestr(x)   ((x)->umodes |= UMODE_COMCHANSRESTR)
+#define SetCloaked(x)         ((x)->umodes |= UMODE_CLOAKED)
+
+#define ClearInvisible(x)     ((x)->umodes &= ~UMODE_INV)
+#define ClearWallops(x)       ((x)->umodes &= ~UMODE_WALLOPS)
+#define ClearDebug(x)         ((x)->umodes &= ~UMODE_DEBUG)
+#define ClearOper(x)          ((x)->umodes &= ~UMODE_OPER)
+#define ClearService(x)       ((x)->umodes &= ~UMODE_SERVICE)
+#define ClearXOper(x)         ((x)->umodes &= ~UMODE_XOPER)
+#define ClearDeaf(x)          ((x)->umodes &= ~UMODE_DEAF)
+#define ClearAccount(x)       ((x)->umodes &= ~UMODE_ACCOUNT)
+#define ClearHideChan(x)      ((x)->umodes &= ~UMODE_HIDECHAN)
+#define ClearHideHost(x)      ((x)->umodes &= ~UMODE_HIDEHOST)
+#define ClearSetHost(x)       ((x)->umodes &= ~UMODE_SETHOST)
+#define ClearRegPriv(x)       ((x)->umodes &= ~UMODE_REGPRIV)
+#define ClearHideIdle(x)      ((x)->umodes &= ~UMODE_HIDEIDLE)
+#define ClearParanoid(x)      ((x)->umodes &= ~UMODE_PARANOID)
+#define ClearComChans(x)      ((x)->umodes &= ~UMODE_COMCHANS)
+#define ClearComChansRestr(x) ((x)->umodes &= ~UMODE_COMCHANSRESTR)
+#define ClearCloaked(x)       ((x)->umodes &= ~UMODE_CLOAKED)
+
+#define IsStaff(x)            ((x)->flags & AFLAG_STAFF)
+#define IsDeveloper(x)        ((x)->flags & AFLAG_DEVELOPER)
+#define IsSupport(x)          ((x)->flags & AFLAG_SUPPORT)
+#define IsAdmin(x)            ((x)->flags & AFLAG_ADMIN)
+#define IsOperFlag(x)         ((x)->flags & AFLAG_OPER)
+
+#define SetStaff(x)           ((x)->flags |= AFLAG_STAFF)
+#define SetDeveloper(x)       ((x)->flags |= AFLAG_DEVELOPER)
+#define SetSupport(x)         ((x)->flags |= AFLAG_SUPPORT)
+#define SetAdmin(x)           ((x)->flags |= AFLAG_ADMIN)
+#define SetOperFlag(x)        ((x)->flags |= AFLAG_OPER)
+
+#define ClearStaff(x)         ((x)->flags &= ~AFLAG_STAFF)
+#define ClearDeveloper(x)     ((x)->flags &= ~AFLAG_DEVELOPER)
+#define ClearSupport(x)       ((x)->flags &= ~AFLAG_SUPPORT)
+#define ClearAdmin(x)         ((x)->flags &= ~AFLAG_ADMIN)
+#define ClearOperFlag(x)      ((x)->flags &= ~AFLAG_OPER)
 
 #define NickOnServiceServer(target)   SIsService(&serverlist[homeserver((target)->numeric)])
 
diff --git a/nickwatch/Makefile b/nickwatch/Makefile
new file mode 100644 (file)
index 0000000..e61f499
--- /dev/null
@@ -0,0 +1,5 @@
+include ../build.mk
+.PHONY: all
+all: nickwatch.so
+
+nickwatch.so: nickwatch.o
diff --git a/nickwatch/nickwatch.c b/nickwatch/nickwatch.c
new file mode 100644 (file)
index 0000000..0015d02
--- /dev/null
@@ -0,0 +1,204 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "../core/schedule.h"
+#include "../control/control.h"
+#include "../newsearch/newsearch.h"
+#include "../newsearch/parser.h"
+
+typedef struct nickwatch {
+  int id;
+
+  char createdby[64];
+  int hits;
+  char term[512];
+  parsertree *tree;
+
+  struct nickwatch *next;
+} nickwatch;
+
+typedef struct nickwatchevent {
+  char description[128];
+  long numeric;
+} nickwatchevent;
+
+static nickwatch *nickwatches;
+static int nextnickwatch = 1;
+
+static void nw_dummyreply(nick *np, char *format, ...) { }
+
+static void nw_dummywall(int level, char *format, ...) { }
+
+static nickwatch *nw_currentwatch;
+static nickwatchevent *nw_currentevent;
+
+static void nw_printnick(searchCtx *ctx, nick *sender, nick *np) {
+  char hostbuf[HOSTLEN+NICKLEN+USERLEN+4];
+
+  nw_currentwatch->hits++;
+
+  controlwall(NO_OPER, NL_HITS, "nickwatch(#%d, %s): %s [%s] (%s) (%s)", nw_currentwatch->id, nw_currentevent->description, visiblehostmask(np,hostbuf),
+               IPtostr(np->ipaddress), printflags(np->umodes, umodeflags), np->realname->name->content);
+}
+
+static nickwatchevent *nwe_new(nick *np, const char *format, ...) {
+  nickwatchevent *nwe;
+  va_list va;
+
+  nwe = malloc(sizeof(nickwatchevent));
+  nwe->numeric = np->numeric;
+
+  va_start(va, format);
+  vsnprintf(nwe->description, sizeof(nwe->description), format, va);
+  va_end(va);
+
+  return nwe;
+}
+
+static void nwe_free(nickwatchevent *nwe) {
+  free(nwe);
+}
+
+static void nw_sched_processevent(void *arg) {
+  nickwatchevent *nwe = arg;
+  nick *np;
+  nickwatch *nw;
+
+  np = getnickbynumeric(nwe->numeric);
+
+  if (!np) {
+    nwe_free(nwe);
+    return;
+  }
+  nw_currentevent = nwe;
+
+  for (nw = nickwatches; nw; nw = nw->next) {
+    nw_currentwatch = nw;
+    ast_nicksearch(nw->tree->root, &nw_dummyreply, mynick, &nw_dummywall, &nw_printnick, NULL, NULL, 10, np);
+  }
+
+  nwe_free(nwe);
+}
+
+static void nw_hook_newnick(int hooknum, void *arg) {
+  nick *np = arg;
+  nickwatchevent *nwe = nwe_new(np, "new user");
+  scheduleoneshot(0, nw_sched_processevent, nwe);
+}
+
+static void nw_hook_rename(int hooknum, void *arg) {
+  void **args = arg;
+  nick *np = args[0];
+  char *oldnick = args[1];
+  nickwatchevent *nwe = nwe_new(np, "renamed from %s", oldnick);
+  scheduleoneshot(0, nw_sched_processevent, nwe);
+}
+
+static void nw_hook_joinchannel(int hooknum, void *arg) {
+  void **args = arg;
+  channel *cp = args[0];
+  nick *np = args[1];
+  nickwatchevent *nwe = nwe_new(np, "join channel %s", cp->index->name->content);
+  scheduleoneshot(0, nw_sched_processevent, nwe);
+}
+
+static int nw_cmd_nickwatch(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  nickwatch *nw;
+  parsertree *tree;
+
+  if (cargc < 1)
+    return CMD_USAGE;
+
+  tree = parse_string(reg_nicksearch, cargv[0]);
+  if (!tree) {
+    displaystrerror(controlreply, sender, cargv[0]);
+    return CMD_ERROR;
+  }
+
+  nw = malloc(sizeof(nickwatch));
+  nw->id = nextnickwatch++;
+  snprintf(nw->createdby, sizeof(nw->createdby), "#%s", sender->authname);
+  nw->hits = 0;
+  strncpy(nw->term, cargv[0], sizeof(nw->term));
+  nw->tree = parse_string(reg_nicksearch, cargv[0]);
+  nw->next = nickwatches;
+  nickwatches = nw;
+
+  controlreply(sender, "Done.");
+
+  return CMD_OK;
+}
+
+static int nw_cmd_nickunwatch(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  nickwatch **pnext, *nw;
+  int id;
+
+  if (cargc < 1)
+    return CMD_USAGE;
+
+  id = atoi(cargv[0]);
+
+  for (pnext = &nickwatches; *pnext; pnext = &((*pnext)->next)) {
+    nw = *pnext;
+
+    if (nw->id == id) {
+      parse_free(nw->tree);
+      *pnext = nw->next;
+      free(nw);
+
+      controlreply(sender, "Done.");
+      return CMD_OK;
+    }
+  }
+
+  controlreply(sender, "Nickwatch #%d not found.", id);
+
+  return CMD_ERROR;
+}
+
+static int nw_cmd_nickwatches(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  nickwatch *nw;
+
+  controlreply(sender, "ID    Created By      Hits    Term");
+
+  for (nw = nickwatches; nw; nw = nw->next)
+    controlreply(sender, "%-5d %-15s %-7d %s", nw->id, nw->createdby, nw->hits, nw->term);
+
+  controlreply(sender, "--- End of nickwatches.");
+
+  return CMD_OK;
+}
+
+void _init(void) {
+  registercontrolhelpcmd("nickwatch", NO_OPER, 1, &nw_cmd_nickwatch, "Usage: nickwatch <nicksearch term>\nAdds a nickwatch entry.");
+  registercontrolhelpcmd("nickunwatch", NO_OPER, 1, &nw_cmd_nickunwatch, "Usage: nickunwatch <#id>\nRemoves a nickwatch entry.");
+  registercontrolhelpcmd("nickwatches", NO_OPER, 0, &nw_cmd_nickwatches, "Usage: nickwatches\nLists nickwatches.");
+
+  registerhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
+  registerhook(HOOK_NICK_RENAME, &nw_hook_rename);
+  registerhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
+  registerhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);
+}
+
+void _fini(void) {
+  nickwatch *nw, *next;
+
+  deregistercontrolcmd("nickwatch", &nw_cmd_nickwatch);
+  deregistercontrolcmd("nickunwatch", &nw_cmd_nickunwatch);
+  deregistercontrolcmd("nickwatches", &nw_cmd_nickwatches);
+
+  deregisterhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
+  deregisterhook(HOOK_NICK_RENAME, &nw_hook_rename);
+  deregisterhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
+  deregisterhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);
+
+  for (nw = nickwatches; nw; nw = next) {
+    next = nw->next;
+
+    parse_free(nw->tree);
+    free(nw);
+  }
+}
diff --git a/noperserv/Makefile b/noperserv/Makefile
deleted file mode 100644 (file)
index 8ecc460..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-include ../build.mk
-
-CFLAGS+=$(INCDBAPI)
-LDFLAGS+=$(LIBDBAPI)
-
-.PHONY: all
-all: noperserv.so noperserv_commands.so noperserv_raw.so
-
-noperserv.so: noperserv.o noperserv_db.o noperserv_hooks.o noperserv_policy.o
-
-noperserv_commands.so: noperserv_commands.o
-
-noperserv_raw.so: noperserv_raw.o
diff --git a/noperserv/noperserv.h b/noperserv/noperserv.h
deleted file mode 100644 (file)
index 139cd04..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __NOPERSERV_H
-#define __NOPERSERV_H
-
-#include "../control/control.h"
-#include "../noperserv/noperserv_db.h"
-#include "../lib/flags.h"
-
-extern int noperserv_ext;
-
-extern const flag no_userflags[];
-extern const flag no_noticeflags[];
-extern const flag no_commandflags[];
-
-#define NO_NICKS_PER_WHOIS_LINE 3
-
-#define NOGetAuthedUser(user)  (no_autheduser *)(user->exts[noperserv_ext])
-#define NOGetAuthLevel(user)   user->authlevel
-#define NOGetNoticeLevel(user) user->noticelevel
-#define NOMax(a, b) (a>b?a:b)
-#define NOMin(a, b) (a<b?b:a)
-
-#endif  
diff --git a/noperserv/noperserv_db.c b/noperserv/noperserv_db.c
deleted file mode 100644 (file)
index 17e77c4..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-/* 
- * NOperserv v0.01
- *
- * A replacement for Germania's ageing Operservice2
- * DB functions
- *
- * Copyright (C) 2005 Chris Porter.
- */
-
-#include "../nick/nick.h"
-#include "../core/error.h"
-#include "../lib/irc_string.h"
-#include "../core/schedule.h"
-#include "../dbapi2/dbapi2.h"
-
-#include "noperserv.h"
-#include "noperserv_db.h"
-
-#include <stdlib.h>
-
-int db_loaded = 0;
-unsigned long loadedusers = 0;
-
-unsigned long lastuserid;
-
-no_autheduser *authedusers = NULL;
-
-void noperserv_create_tables(void);
-
-void noperserv_free_user(no_autheduser *au);
-void noperserv_load_users(const DBAPIResult *res, void *arg);
-
-void noperserv_check_nick(nick *np);
-void noperserv_nick_account(int hooknum, void *arg);
-void noperserv_quit_account(int hooknum, void *arg);
-
-void nopserserv_delete_from_autheduser(nick *np, no_autheduser *au);
-
-static DBAPIConn *nodb;
-
-int noperserv_load_db(void) {
-  if(!nodb) {
-    nodb = dbapi2open(DBAPI2_DEFAULT, "noperserv");
-    if(!nodb) {
-      Error("noperserv", ERR_STOP, "Could not connect to database.");
-      return 0;
-    }
-  }
-
-  db_loaded = 1;
-
-  authedusers = NULL;
-
-  noperserv_create_tables();
-
-  nodb->query(nodb, noperserv_load_users, NULL,
-    "SELECT ID, authname, flags, noticelevel FROM ?", "T", "users");
-
-  return 1;
-}
-
-void noperserv_load_users(const DBAPIResult *res, void *arg) {
-  no_autheduser *nu;
-  nick *np;
-  int i;
-
-  if(!res)
-    return;
-
-  if(!res->success) {
-    Error("noperserv", ERR_ERROR, "Error loading user list.");
-    res->clear(res);
-    return;
-  }
-
-  lastuserid = 0;
-
-  while(res->next(res)) {
-    nu = noperserv_new_autheduser(res->get(res, 1));
-    if(!nu)
-      continue;
-
-    nu->id = strtoul(res->get(res, 0), NULL, 10);
-    nu->authlevel = strtoul(res->get(res, 2), NULL, 10);
-    nu->noticelevel = strtoul(res->get(res, 3), NULL, 10);
-    nu->newuser = 0;
-    if(nu->id > lastuserid)
-      lastuserid = nu->id;
-  }
-
-  Error("noperserv", ERR_INFO, "Loaded %lu users", loadedusers);
-  
-  for(i=0;i<NICKHASHSIZE;i++)
-    for(np=nicktable[i];np;np=np->next)
-      if(IsAccount(np))
-        noperserv_check_nick(np);
-
-  registerhook(HOOK_NICK_ACCOUNT, &noperserv_nick_account);
-  registerhook(HOOK_NICK_NEWNICK, &noperserv_nick_account);
-  registerhook(HOOK_NICK_LOSTNICK, &noperserv_quit_account);
-
-  res->clear(res);
-}
-
-void noperserv_create_tables(void) {
-  nodb->createtable(nodb, NULL, NULL,
-    "CREATE TABLE ? ("
-      "ID            INT               NOT NULL,"
-      "authname      VARCHAR(?)       NOT NULL,"
-      "flags         INT               NOT NULL,"
-      "noticelevel   INT               NOT NULL,"
-      "PRIMARY KEY (ID))", "Td", "users", ACCOUNTLEN);
-}
-
-void noperserv_cleanup_db(void) {
-  no_autheduser *ap, *np;
-
-  deregisterhook(HOOK_NICK_LOSTNICK, &noperserv_quit_account);
-  deregisterhook(HOOK_NICK_NEWNICK, &noperserv_nick_account);
-  deregisterhook(HOOK_NICK_ACCOUNT, &noperserv_nick_account);
-
-  ap = authedusers;
-  while(ap) {
-    np = ap->next;
-    noperserv_free_user(ap);
-    ap = np;
-  }
-
-  nodb->close(nodb);
-  nodb = NULL;
-}
-
-no_autheduser *noperserv_new_autheduser(char *authname) {
-  no_autheduser *au = (no_autheduser *)malloc(sizeof(no_autheduser));
-  if(!au)
-    return NULL;
-
-  au->authname = getsstring(authname, ACCOUNTLEN);
-  if(!au->authname) {
-    free(au);
-    return NULL;
-  }
-
-  loadedusers++;
-  au->newuser = 1;
-  au->nick = NULL;
-
-  au->next = authedusers;
-  authedusers = au;
-
-  return au;
-}
-
-void noperserv_delete_autheduser(no_autheduser *au) {
-  no_autheduser *ap = authedusers, *lp = NULL;
-
-  if(!au->newuser)
-    nodb->squery(nodb, "DELETE FROM ? WHERE id = ?", "Tu", "users", au->id);
-
-  for(;ap;lp=ap,ap=ap->next) {
-    if(ap == au) {
-      if(lp) {
-        lp->next = ap->next;
-      } else {
-        authedusers = ap->next;
-      }
-      noperserv_free_user(ap);
-      return;
-    }
-  }
-}
-
-void noperserv_update_autheduser(no_autheduser *au) {
-  if(au->newuser) {
-    nodb->squery(nodb, "INSERT INTO ? (id, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au->id, au->authname->content, NOGetAuthLevel(au), NOGetNoticeLevel(au));
-    au->newuser = 0;
-  } else {
-    nodb->squery(nodb, "UPDATE ? SET flags = ?, noticelevel = ? WHERE id = ?", "Tuuu", "users", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->id);
-  }
-}
-
-void noperserv_free_user(no_autheduser *au) {
-  no_nicklist *cp = au->nick, *np;
-
-  while(cp) {
-    cp->nick->exts[noperserv_ext] = NULL;
-    np = cp->next;
-    free(cp);
-    cp = np;
-  }
-
-  freesstring(au->authname);
-  free(au);
-
-  loadedusers--;
-}
-
-void noperserv_check_nick(nick *np) {
-  no_autheduser *au = noperserv_get_autheduser(np->authname);
-  if(au)
-    noperserv_add_to_autheduser(np, au);
-}
-
-void noperserv_nick_account(int hooknum, void *arg) {
-  noperserv_check_nick((nick *)arg);
-}
-
-void noperserv_quit_account(int hooknum, void *arg) {
-  nick *np = (void *)arg;
-  no_autheduser *au = NOGetAuthedUser(np);
-  no_nicklist *nl, *ln = NULL;
-  if(!au)
-    return;
-
-  for(nl=au->nick;nl;ln=nl,nl=nl->next)
-    if(nl->nick == np) {
-      if(ln) {
-        ln->next = nl->next;
-      } else {
-        au->nick = nl->next;
-      }
-      free(nl);
-      break;
-    }
-}
-
-no_autheduser *noperserv_get_autheduser(char *authname) {
-  no_autheduser *au = authedusers;
-
-  for(;au;au=au->next)
-    if(!ircd_strcmp(authname, au->authname->content))
-      return au;
-
-  return NULL;
-}
-
-unsigned long noperserv_get_autheduser_count(void) {
-  return loadedusers;
-}
-
-unsigned long noperserv_next_autheduser_id(void) {
-  return ++lastuserid;
-}
-
-void noperserv_add_to_autheduser(nick *np, no_autheduser *au) {
-  no_nicklist *nl = (no_nicklist *)malloc(sizeof(no_nicklist));
-  if(!nl)
-    return;
-
-  np->exts[noperserv_ext] = au;
-
-  nl->nick = np;
-
-  nl->next = au->nick;
-  au->nick = nl;
-}
-
-void nopserserv_delete_from_autheduser(nick *np, no_autheduser *au) {
-  no_nicklist *cp = au->nick, *lp = NULL;
-
-  for(;cp;lp=cp,cp=cp->next)
-    if(cp->nick == np) {
-      if(lp) {
-        lp->next = cp->next;
-      } else {
-        au->nick = cp->next;
-      }
-      free(cp);
-      break;
-    }
-}
diff --git a/noperserv/noperserv_hooks.c b/noperserv/noperserv_hooks.c
deleted file mode 100644 (file)
index 3df5e87..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-#include "../control/control.h"
-#include "../localuser/localuser.h"
-#include "../core/schedule.h"
-#include "../core/modules.h"
-#include "../lib/splitline.h"
-#include "../lib/flags.h"
-#include "../lib/irc_string.h"
-#include "../lib/strlfunc.h"
-
-#include "noperserv.h"
-#include "noperserv_db.h"
-#include "noperserv_hooks.h"
-#include "noperserv_policy.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-struct storedhook {
-  CommandHandler old;
-  sstring *name;
-  cmdhelp *oldhelp;
-  cmdhelp *newhelp;
-  struct storedhook *next;
-} storedhook;
-
-struct storedhook *storedhooks = NULL;
-
-int firsttime = 0;
-nick *replynick = NULL;
-
-UserMessageHandler oldhandler;
-ControlMsg oldreply;
-ControlWall oldwall;
-ControlPermitted oldpermitted;
-
-void noperserv_trap_registration(int hooknum, void *arg);
-int noperserv_showcommands(void *sender, int cargc, char **cargv);
-int noperserv_rmmod(void *sender, int cargc, char **cargv);
-int noperserv_reload(void *sender, int cargc, char **cargv);
-int noperserv_whois(void *sender, int cargc, char **cargv);
-int noperserv_help(void *sender, int cargc, char **cargv);
-void noperserv_whois_handler(int hooknum, void *arg);
-void noperserv_whois_account_handler(int hooknum, void *arg);
-void noperserv_handle_messages(nick *target, int messagetype, void **args);
-void noperserv_reply(nick *np, char *format, ...) __attribute__ ((format (printf, 2, 3)));
-void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ...);
-
-struct specialsched special;
-
-#define HOOK_CONTROL_WHOISREQUEST_AUTHNAME -1
-#define HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER -2
-
-void noperserv_setup_hooks(void) {
-  oldreply = controlreply;
-  controlreply = &noperserv_reply;
-  
-  oldwall = controlwall;
-  controlwall = &noperserv_wall;
-
-  oldpermitted = controlpermitted;
-  controlpermitted = &noperserv_policy_command_permitted;
-
-  memset(&special, 0, sizeof(struct specialsched));
-
-  if(!mynick) {
-    registerhook(HOOK_CONTROL_REGISTERED, &noperserv_trap_registration);
-  } else {
-    noperserv_trap_registration(0, (void *)mynick);
-  }
-
-  registerhook(HOOK_CONTROL_WHOISREQUEST, &noperserv_whois_handler);
-}
-
-int noperserv_hook_command(char *command, CommandHandler newcommand, char *newhelp) {
-  struct storedhook *newhook;
-  Command *fetchcommand = findcommandintree(controlcmds, command, 1);
-
-  if(!fetchcommand)
-    return 1;
-
-  newhook = (struct storedhook *)malloc(sizeof(struct storedhook));
-  if(!newhook)
-    return 1;
-
-  newhook->name = getsstring(command, strlen(command));
-  if(!newhook->name) {
-    free(newhook);
-    return 1;
-  }
-
-  newhook->old = fetchcommand->handler;
-  if(newhelp) {
-    newhook->newhelp = (cmdhelp *)malloc(sizeof(cmdhelp));
-    memset(newhook->newhelp,0,sizeof(cmdhelp));
-    if(!newhook->newhelp) {
-      freesstring(newhook->name);
-      free(newhook);
-    } else {
-      int len = strlen(newhelp) + 1;
-      newhook->newhelp->helpstr = (char *)malloc(len);
-      if (newhook->newhelp->helpstr) {
-        strlcpy(newhook->newhelp->helpstr, newhelp, len);
-      } 
-      newhook->oldhelp = fetchcommand->ext;
-      fetchcommand->ext = newhook->newhelp;
-    }
-  } else {
-    newhook->newhelp = NULL;
-  }
-  
-  newhook->next = storedhooks;
-  storedhooks = newhook;
-  
-  fetchcommand->handler = newcommand;
-
-  return 0;
-}
-
-void noperserv_unhook_all_commands(void) {
-  struct storedhook *nh, *ch = storedhooks;
-  Command *fetchcommand;
-
-  while(ch) {
-    if(ch->old && (fetchcommand = findcommandintree(controlcmds, ch->name->content, 1))) {
-      fetchcommand->handler = ch->old;
-      if(ch->newhelp) {
-        fetchcommand->ext = ch->oldhelp;
-        if ( ((cmdhelp *)ch->newhelp)->helpstr)
-          free( ((cmdhelp *)ch->newhelp)->helpstr);
-        free(ch->newhelp);
-      }
-    }
-    nh = ch->next;
-    freesstring(ch->name);
-    free(ch);
-    ch = nh;
-  }
-}
-
-void noperserv_cleanup_hooks(void) {
-  deregisterhook(HOOK_CONTROL_WHOISREQUEST, &noperserv_whois_handler);
-  deregisterhook(HOOK_CONTROL_REGISTERED, &noperserv_trap_registration);
-  
-  if(firsttime) {
-    noperserv_unhook_all_commands();
-    firsttime = 0;
-  }
-
-  if(oldhandler && mynick)
-    hooklocaluserhandler(mynick, oldhandler);
-
-  controlwall = oldwall;
-  controlreply = oldreply;
-  controlpermitted = oldpermitted;
-}
-
-void noperserv_trap_registration(int hooknum, void *arg) {
-  nick *np = (nick *)arg;
-  if(!np)
-    return;
-
-  oldhandler = hooklocaluserhandler((nick *)arg, &noperserv_handle_messages);
-  if(!oldhandler)
-    return;
-
-  if(!firsttime) {
-    firsttime = 1;
-    noperserv_hook_command("rmmod", &noperserv_rmmod, NULL);
-    noperserv_hook_command("reload", &noperserv_reload, NULL);
-    noperserv_hook_command("showcommands", &noperserv_showcommands, NULL);
-    noperserv_hook_command("whois", &noperserv_whois, "Usage: whois <nickname|#authname|*numeric>\nDisplays lots of information about the specified nickname, auth name or numeric.");
-    noperserv_hook_command("help", &noperserv_help, NULL);
-  }
-}
-
-CommandHandler noperserv_find_hook(char *command) {
-  struct storedhook *hh = storedhooks;
-  for(;hh;hh=hh->next)
-    if(!ircd_strcmp(hh->name->content, command))
-      return hh->old;
-
-  return NULL;
-}
-
-int noperserv_modules_loaded(char *mask) {
-  int i;
-  char *ptr;
-
-  for(i=0,ptr=lsmod(i,NULL,NULL,NULL);ptr;ptr=lsmod(++i,NULL,NULL,NULL))
-    if(match2strings(mask, ptr))
-      return 1;
-
-  return 0;
-}
-
-int noperserv_specialmod(nick *np, char *command, ScheduleCallback reloadhandler, int cargc, char **cargv) {
-  CommandHandler oldcommand = noperserv_find_hook(command);
-  if(cargc < 1) {
-    if(oldcommand)
-      return oldcommand(np, cargc, cargv);
-    return CMD_ERROR;
-  }
-
-  if(!strcmp(cargv[0], "noperserv")) {
-    if(special.schedule) {
-      controlreply(np, "Previous attempt at un/reload still in progress.");
-      return CMD_OK;
-    } else {
-      special.modulename = getsstring(cargv[0], strlen(cargv[0]));
-      if(!special.modulename) {
-        controlreply(np, "Unable to copy module name. Seek cow herd to trample on server.");
-        return CMD_ERROR;
-      } else {
-        special.schedule = scheduleoneshot(time(NULL) + 1, reloadhandler, &special);
-        if(!special.schedule) {
-          freesstring(special.modulename);
-          special.modulename = NULL;
-          controlreply(np, "Unable to allocate schedule. Seek cow herd to trample on server.");
-          return CMD_ERROR;
-        }
-        controlreply(np, "Special case un/reload in <1 second, no response will be sent, standby. . .");
-        return CMD_OK;
-      }
-    }
-  } else {
-    if(oldcommand)
-      return oldcommand(np, cargc, cargv);
-    return CMD_ERROR;
-  }
-}
-
-int noperserv_rmmod(void *sender, int cargc, char **cargv) {
-  return noperserv_specialmod(sender, "rmmod", &controlspecialrmmod, cargc, cargv);
-}
-
-int noperserv_reload(void *sender, int cargc, char **cargv) {
-  return noperserv_specialmod(sender, "reload", &controlspecialreloadmod, cargc, cargv);
-}
-
-void noperserv_whois_hook(int hooknum, void *arg) {
-  controlreply(replynick, "%s", (char *)arg);
-}
-
-int noperserv_whois(void *sender, int cargc, char **cargv) {
-  no_autheduser *au;
-  nick *np = (nick *)sender;
-  CommandHandler oldwhois = noperserv_find_hook("whois");
-
-  if(cargc < 1) {
-    if(oldwhois)
-      return oldwhois(sender, cargc, cargv);
-    return CMD_ERROR;
-  }
-
-  if(cargv[0][0] != '#') {
-    if(cargv[0][0] == '*')
-      cargv[0][0] = '#';
-    if(oldwhois)
-      return oldwhois(sender, cargc, cargv);
-    return CMD_ERROR;
-  }
-  
-  au = noperserv_get_autheduser(cargv[0] + 1);
-  if(!au) {
-    controlreply(np, "Account not registered.");
-    return CMD_OK;
-  }
-
-  controlreply(np, "Account   : %s", au->authname->content);
-
-  replynick = np;
-
-  registerhook(HOOK_CONTROL_WHOISREPLY, &noperserv_whois_hook);
-  noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
-  deregisterhook(HOOK_CONTROL_WHOISREPLY, &noperserv_whois_hook);
-
-  controlreply(np, "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
-
-  return CMD_OK;
-}
-
-int noperserv_showcommands(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
-  Command *cmdlist[100];
-  int i, n;
-    
-  n = getcommandlist(controlcmds, cmdlist, 100);
-  
-  controlreply(np, "The following commands are registered at present:");
-  
-  for(i=0;i<n;i++)
-    if(noperserv_policy_command_permitted(cmdlist[i]->level, np))
-      controlreply(np, " %-25s %s", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
-
-  controlreply(np, "End of list.");
-  return CMD_OK;
-}
-
-void noperserv_whois_handler(int hooknum, void *arg) {
-  char message[100];
-  nick *np = (nick *)arg;
-  no_autheduser *au;
-  if(!np)
-    return;
-
-  if(IsAccount(np)) {
-    au = NOGetAuthedUser(np);
-    if(au) {
-      snprintf(message, sizeof(message), "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
-      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
-    } else {
-      snprintf(message, sizeof(message), "Flags     : (user not known)");
-      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHNAME, (void *)np->authname);
-    }
-    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
-  }
-}
-
-/* mmm, hacky */
-void noperserv_whois_account_handler(int hooknum, void *arg) {
-  int count = 0, found = 0;
-  char nickbuffer[(NICKLEN + 2) * NO_NICKS_PER_WHOIS_LINE - 1]; /* since we don't need space or comma for the first item we're fine NULL wise */
-  char accountspace[NICKLEN + 3]; /* space, comma, null */
-  char message[1024];
-  
-  nickbuffer[0] = '\0';
-  if(hooknum == HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER) {
-    /* we can just read out the authed user linked list */
-    no_autheduser *au = (void *)arg;
-    no_nicklist *nl = au->nick;
-    
-    if(nl)
-      found = 1;
-
-    for(;nl;nl=nl->next) {
-      snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", nl->nick->nick);
-      strlcat(nickbuffer, accountspace, sizeof(nickbuffer));
-
-      if(count >= NO_NICKS_PER_WHOIS_LINE) {
-        snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
-        triggerhook(HOOK_CONTROL_WHOISREPLY, message);
-        nickbuffer[0] = '\0';
-        count = 0;
-      }
-    }
-  } else {
-    /* inefficient way */
-    char *authname = (char *)arg;
-    int i = 0;
-    nick *sp;
-
-    for(;i<NICKHASHSIZE;i++)
-      for(sp=nicktable[i];sp;sp=sp->next)
-        if(IsAccount(sp) && !ircd_strcmp(sp->authname, authname)) {
-          found = 1;
-
-          snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", sp->nick);
-          strlcat(nickbuffer, accountspace, sizeof(nickbuffer));
-
-          if(count >= NO_NICKS_PER_WHOIS_LINE) {
-            snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
-            triggerhook(HOOK_CONTROL_WHOISREPLY, message);
-            nickbuffer[0] = '\0';
-            count = 0;
-          }
-        }
-  }
-
-  if(!found) {
-    snprintf(message, sizeof(message), "Authed    : (no nicks authed)");
-    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
-  } else if(nickbuffer[0]) {
-    snprintf(message, sizeof(message), "Authed    : %s", nickbuffer);
-    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
-  }
-}
-
-/* Obviously pinched from control.c */
-void noperserv_handle_messages(nick *target, int messagetype, void **args) {
-  Command *cmd;
-  char *cargv[50];
-  int cargc;
-  nick *sender;
-
-  switch(messagetype) {
-    case LU_PRIVMSG: /* override these two commands only */
-    case LU_SECUREMSG:
-      /* If it's a message, first arg is nick and second is message */
-      sender = (nick *)args[0];
-
-      controlwall(NO_DEVELOPER, NL_ALL_COMMANDS, "From: %s!%s@%s%s%s: %s", sender->nick, sender->ident, sender->host->name->content, IsAccount(sender)?"/":"", IsAccount(sender)?sender->authname:"", (char *)args[1]);
-
-      /* Split the line into params */
-      cargc = splitline((char *)args[1], cargv, 50, 0);
-      
-      if(!cargc) /* Blank line */
-        return;
-               
-      cmd = findcommandintree(controlcmds,cargv[0],1);
-      if(!cmd) {
-        controlreply(sender, "Unknown command or access denied.");
-        return;
-      }
-      
-      /* If we were doing "authed user tracking" here we'd put a check in for authlevel */
-      /* Here it is! */
-      if (!noperserv_policy_command_permitted(cmd->level, sender)) {
-        controlreply(sender, "Unknown command or access denied.");
-        return;
-      }
-
-      /* Check the maxargs */
-      if(cmd->maxparams < (cargc - 1)) {
-        /* We need to do some rejoining */
-        rejoinline(cargv[cmd->maxparams], cargc - (cmd->maxparams));
-        cargc = (cmd->maxparams) + 1;
-      }
-      
-      if((cmd->handler)((void *)sender,cargc-1,&(cargv[1])) == CMD_USAGE)
-        controlhelp(sender, cmd);
-
-      break;
-    default:
-      if(oldhandler)
-        oldhandler(target, messagetype, args);
-      break;
-  }
-}
-
-void noperserv_reply(nick *np, char *format, ...) {
-  char buf[512];
-  va_list va;
-  no_autheduser *au = NOGetAuthedUser(np);
-
-  va_start(va, format);
-  vsnprintf(buf, sizeof(buf), format, va);
-  va_end(va);
-  
-  if(au && !(NOGetNoticeLevel(au) & NL_NOTICES)) {
-    controlmessage(np, "%s", buf);
-  } else {
-    controlnotice(np, "%s", buf);
-  }
-}
-
-int noperserv_help(void *sender, int cargc, char **cargv) {
-  Command *cmd;
-  nick *np = (nick *)sender;
-
-  if(cargc < 1)
-    return CMD_USAGE;
-
-  cmd = findcommandintree(controlcmds, cargv[0], 1);
-  if(!cmd || !noperserv_policy_command_permitted(cmd->level, np)) {
-    controlreply(np, "Unknown command or access denied.");
-    return CMD_ERROR;
-  }
-
-  controlhelp(np, cmd);
-  return CMD_OK;
-}
-
-void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ...) {
-  char buf[512];
-  va_list va;
-  no_autheduser *au = authedusers;
-  no_nicklist *nl;
-  char *flags = printflags(noticelevel, no_noticeflags) + 1;
-
-  va_start(va, format);
-  vsnprintf(buf, sizeof(buf), format, va);
-  va_end(va);
-
-  Error("noperserv", ERR_INFO, "$%s$ %s", flags, buf);
-
-  for(;au;au=au->next) {
-    if((NOGetNoticeLevel(au) & noticelevel) && !(NOGetAuthLevel(au) & __NO_RELAY)) {
-      for(nl=au->nick;nl;nl=nl->next)
-        if(noperserv_policy_command_permitted(permissionlevel, nl->nick))
-          controlreply(nl->nick, "$%s$ %s", flags, buf);
-    }
-  }
-}
diff --git a/noperserv/noperserv_hooks.h b/noperserv/noperserv_hooks.h
deleted file mode 100644 (file)
index 9cc39dd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-void noperserv_setup_hooks(void);\r
-void noperserv_cleanup_hooks(void);\r
index e0a7b517cf6401dbe96092dd92871dc5c197b5b3..121c3eece9dda7c1db613e84980b01716b95034d 100644 (file)
@@ -5,13 +5,13 @@
 #include <string.h>
 #include "patriciasearch.h"
 
-int ast_nodesearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NodeDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_nodesearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NodeDisplayFunc display, HeaderFunc header, void *headerarg, int limit, patricia_node_t *target) {
   searchCtx ctx;
   searchASTCache cache;
   searchNode *search;
   char buf[1024];
 
-  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nodesearch, sender, display, limit);
+  newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nodesearch, sender, display, limit, target);
 
   memset(&cache, 0, sizeof(cache));
   cache.tree = tree;
index c9018c7928633fc5840a0a3528a6fd6e54738612..b695b5fb79354849396a740f4a4563ba73bfbf98 100644 (file)
@@ -78,7 +78,7 @@ int do_pnodesearch_real(replyFunc reply, wallFunc wall, void *source, int cargc,
     return CMD_ERROR;
   }
 
-  ast_nodesearch(tree->root, reply, sender, wall, display, NULL, NULL, limit);
+  ast_nodesearch(tree->root, reply, sender, wall, display, NULL, NULL, limit, NULL);
 
   parse_free(tree);
 
index db3b48b76301711c0da750227bbda7bddc3073e9..ac4a920b341480710f4eb8e3e7dfa0d4afdc6bc1 100644 (file)
@@ -11,7 +11,7 @@ void pnodesearch_exe(struct searchNode *search, searchCtx *ctx, patricia_node_t
 
 int do_pnodesearch_real(replyFunc reply, wallFunc wall, void *source, int cargc, char **cargv);
 
-int ast_nodesearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NodeDisplayFunc display, HeaderFunc header, void *headerarg, int limit);
+int ast_nodesearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NodeDisplayFunc display, HeaderFunc header, void *headerarg, int limit, patricia_node_t *target);
 
 void regpnodedisp(const char *name, NodeDisplayFunc handler);
 void unregpnodedisp(const char *name, NodeDisplayFunc handler);
diff --git a/raw/Makefile b/raw/Makefile
new file mode 100644 (file)
index 0000000..5aee0c0
--- /dev/null
@@ -0,0 +1,6 @@
+include ../build.mk
+
+.PHONY: all
+all: raw.so
+
+raw.so: raw.o
similarity index 100%
rename from noperserv/noperserv_raw.c
rename to raw/raw.c
index 51d7ebd86008606c395d05d250131dffd09ae557..feed150ac033790cd7925e2fdc4dbc4e360651cb 100644 (file)
@@ -54,7 +54,7 @@ int lr_requestl(nick *svc, nick *np, channel *cp, nick *qnick) {
   /* treat blocked users as if they're out of targets */
   if(rq_findblock(np->authname) || !rq_tryfasttrack(np)) {
     sendnoticetouser(svc, np, "Sorry, you may not request %s for another "
-      "channel at this time. Please try again in an hour.", RQ_QNICK);
+      "channel at this time. Please try again in an hour.", rq_qnick->content);
 
     lr_notargets++;
 
@@ -66,7 +66,7 @@ int lr_requestl(nick *svc, nick *np, channel *cp, nick *qnick) {
 
   sendnoticetouser(svc, np, "Success! %s has been added to '%s' "
         "(contact #help if you require further assistance).", 
-        RQ_QNICK, cp->index->name->content);
+        rq_qnick->content, cp->index->name->content);
 
   return RQ_OK;
 }
index 7c192909432666277f3c50ea014321d9b016ea79..45d8ec762af507cf3f64cc88f42f3dca5cd1e487 100644 (file)
@@ -4,6 +4,7 @@
 #include <string.h>
 #include "../localuser/localuser.h"
 #include "../localuser/localuserchannel.h"
+#include "../core/config.h"
 #include "../core/schedule.h"
 #include "../lib/irc_string.h"
 #include "../lib/splitline.h"
@@ -44,9 +45,16 @@ int rq_blocked = 0;
 /* log fd */
 FILE *rq_logfd;
 
+/* config */
+sstring *rq_qserver, *rq_qnick, *rq_sserver, *rq_snick;
+sstring *rq_nick, *rq_user, *rq_host, *rq_real, *rq_auth;
+int rq_authid;
+
 static int extloaded = 0;
 
 void _init(void) {
+  sstring *m;
+
   if(!rq_initblocks())
     return;
 
@@ -55,6 +63,22 @@ void _init(void) {
 
   extloaded = 1;
 
+  rq_nick = getcopyconfigitem("request", "nick", "R", BUFSIZE);
+  rq_user = getcopyconfigitem("request", "user", "request", BUFSIZE);
+  rq_host = getcopyconfigitem("request", "host", "request.quakenet.org", BUFSIZE);
+  rq_real = getcopyconfigitem("request", "real", "Service Request v0.23", BUFSIZE);
+  rq_auth = getcopyconfigitem("request", "auth", "R", BUFSIZE);
+  rq_qnick = getcopyconfigitem("request", "qnick", "Q", BUFSIZE);
+  rq_qserver = getcopyconfigitem("request", "qserver", "CServe.quakenet.org", BUFSIZE);
+  rq_snick = getcopyconfigitem("request", "snick", "S", BUFSIZE);
+  rq_sserver = getcopyconfigitem("request", "sserver", "services2.uk.quakenet.org", BUFSIZE);
+
+  m = getconfigitem("request", "authid");
+  if (!m)
+    rq_authid = 1780711;
+  else
+    rq_authid = atoi(m->content);
+
   rqcommands = newcommandtree();
 
   addcommandtotree(rqcommands, "showcommands", RQU_ANY, 1, &rqcmd_showcommands);
@@ -69,7 +93,7 @@ void _init(void) {
   
   qr_initrequest();
 
-  rq_logfd = fopen(RQ_LOGFILE, "a");
+  rq_logfd = fopen("logs/request.log", "a");
   
   scheduleoneshot(time(NULL) + 1, (ScheduleCallback)&rq_registeruser, NULL);
 }
@@ -96,6 +120,12 @@ void _fini(void) {
   rq_finifasttrack();
   qr_finirequest();
 
+  freesstring(rq_nick);
+  freesstring(rq_user);
+  freesstring(rq_host);
+  freesstring(rq_real);
+  freesstring(rq_auth);
+
   if (rq_logfd != NULL)
     fclose(rq_logfd);
 
@@ -105,15 +135,15 @@ void _fini(void) {
 void rq_registeruser(void) {
   channel *cp;
 
-  rqnick = registerlocaluserflags(RQ_REQUEST_NICK, RQ_REQUEST_USER, RQ_REQUEST_HOST,
-                             RQ_REQUEST_REAL, RQ_REQUEST_AUTH, RQ_REQUEST_AUTHID, 0,
+  rqnick = registerlocaluserflags(rq_nick->content, rq_user->content, rq_host->content,
+                             rq_real->content, rq_auth->content, rq_authid, 0,
                              UMODE_ACCOUNT | UMODE_SERVICE | UMODE_OPER,
                              rq_handler);
 
-  cp = findchannel(RQ_TLZ);
+  cp = findchannel("#twilightzone");
 
   if (cp == NULL)
-    localcreatechannel(rqnick, RQ_TLZ);
+    localcreatechannel(rqnick, "#twilightzone");
   else
     localjoinchannel(rqnick, cp);
 }
@@ -221,11 +251,11 @@ int rq_genericrequestcheck(nick *np, char *channelname, channel **cp, nick **qni
     return RQ_ERROR;
   }
 
-  *qnick = getnickbynick(RQ_QNICK);
+  *qnick = getnickbynick(rq_qnick->content);
 
-  if (*qnick == NULL || findserver(RQ_QSERVER) < 0) {
+  if (*qnick == NULL || findserver(rq_qserver->content) < 0) {
     sendnoticetouser(rqnick, np, "Error: %s does not seem to be online. "
-          "Please try again later.", RQ_QNICK);
+          "Please try again later.", rq_qnick->content);
 
     return RQ_ERROR;
   }
@@ -317,7 +347,7 @@ int rqcmd_request(void *user, int cargc, char **cargv) {
   qhand = getnumerichandlefromchanhash(cp->users, qnick->numeric);
 
   if (qhand != NULL) {
-    sendnoticetouser(rqnick, np, "Error: %s is already on that channel.", RQ_QNICK);
+    sendnoticetouser(rqnick, np, "Error: %s is already on that channel.", rq_qnick->content);
 
     rq_failed++;
 
@@ -332,7 +362,7 @@ int rqcmd_request(void *user, int cargc, char **cargv) {
     strftime(now, sizeof(now), "%c", localtime(&now_ts));
 
     fprintf(rq_logfd, "%s: request (%s) for %s from %s!%s@%s%s%s: Request was %s.\n",
-      now, RQ_QNICK, cp->index->name->content,
+      now, rq_qnick->content, cp->index->name->content,
       np->nick, np->ident, np->host->name->content, IsAccount(np)?"/":"", IsAccount(np)?np->authname:"",
       (retval == RQ_OK) ? "accepted" : "denied");
     fflush(rq_logfd);
@@ -367,11 +397,11 @@ int rqcmd_requestspamscan(void *user, int cargc, char **cargv) {
     return RQ_ERROR;
   }
 
-  snick = getnickbynick(RQ_SNICK);
+  snick = getnickbynick(rq_snick->content);
 
-  if (snick == NULL || findserver(RQ_SSERVER) < 0) {
+  if (snick == NULL || findserver(rq_sserver->content) < 0) {
     sendnoticetouser(rqnick, np, "Error: %s does not seem to be online. "
-            "Please try again later.", RQ_SNICK);
+            "Please try again later.", rq_snick->content);
 
     rq_failed++;
 
@@ -382,7 +412,7 @@ int rqcmd_requestspamscan(void *user, int cargc, char **cargv) {
   shand = getnumerichandlefromchanhash(cp->users, snick->numeric);
 
   if (shand != NULL) {
-    sendnoticetouser(rqnick, np, "Error: %s is already on that channel.", RQ_SNICK);
+    sendnoticetouser(rqnick, np, "Error: %s is already on that channel.", rq_snick->content);
 
     rq_failed++;
 
@@ -406,7 +436,7 @@ int rqcmd_requestspamscan(void *user, int cargc, char **cargv) {
     /* channel apparently doesn't have Q */
     
    sendnoticetouser(rqnick, np, "Error: You need %s in order to be "
-        "able to request %s.", RQ_QNICK, RQ_SNICK);
+        "able to request %s.", rq_qnick->content, rq_snick->content);
 
     rq_failed++;
 
index c962fa63a2ac9420209c982ac20e0d033ac9ff0e..7ead343e94e0fb8058254f580b8121999268c55e 100644 (file)
@@ -1,23 +1,8 @@
-#define RQ_TLZ "#twilightzone"
-
-#define RQ_QSERVER "CServe.quakenet.org"
-#define RQ_QNICK "Q"
-
-#define RQ_SSERVER "services2.uk.quakenet.org"
-#define RQ_SNICK "S"
-
-#define RQ_REQUEST_NICK "R"
-#define RQ_REQUEST_USER "request"
-#define RQ_REQUEST_HOST "request.quakenet.org"
-#define RQ_REQUEST_REAL "Service Request v0.23"
-#define RQ_REQUEST_AUTH "R"
-#define RQ_REQUEST_AUTHID 1780711
+#include "../lib/sstring.h"
 
 #define RQU_ANY 0
 #define RQU_OPER 1
 
-#define RQ_LOGFILE "logs/request.log"
-
 #define RQ_OK 0
 #define RQ_ERROR 1
 #define RQ_UNKNOWN 2
@@ -27,4 +12,9 @@ extern int rq_success;
 
 extern FILE *rq_logfd;
 
+/* config */
+extern sstring *rq_qserver, *rq_qnick, *rq_sserver, *rq_snick;
+extern sstring *rq_nick, *rq_user, *rq_host, *rq_real, *rq_auth;
+extern int rq_authid;
+
 char *rq_longtoduration(unsigned long interval);
index 1857b575a3c36b9c24a4658b27f77a5c9b87b004..f2e069889fcac4c0f2f9b630e3c481955bc5b916 100644 (file)
@@ -171,7 +171,7 @@ static void qr_result(requestrec *req, int outcome, char failcode, char *message
     strftime(now, sizeof(now), "%c", localtime(&now_ts));
     fprintf(rq_logfd, "%s: request (%s) for %s (%d unique users, "
             "%d total users) from %s!%s@%s%s%s: Request was %s (%c).\n", now,
-            (req->what == QR_CSERVE) ? RQ_QNICK : RQ_SNICK,
+            (req->what == QR_CSERVE) ? rq_qnick->content : rq_snick->content,
             req->cip->name->content, unique, total,
             tnp->nick, tnp->ident, tnp->host->name->content, IsAccount(tnp)?"/":"", IsAccount(tnp)?tnp->authname:"",
             (outcome == QR_OK) ? "accepted" : "denied", failcode);
@@ -182,10 +182,10 @@ static void qr_result(requestrec *req, int outcome, char failcode, char *message
     if (req->what == QR_SPAMSCAN) {
       /* Add S */
 
-      if (!(snp=getnickbynick(RQ_SNICK))) {
+      if (!(snp=getnickbynick(rq_snick->content))) {
         sendnoticetouser(rqnick, tnp,
                          "Cannot find %s on the network. "
-                         "Please try your request again later.", RQ_SNICK);
+                         "Please try your request again later.", rq_snick->content);
 
         free(req);
         return;
@@ -193,7 +193,7 @@ static void qr_result(requestrec *req, int outcome, char failcode, char *message
 
       sendnoticetouser(rqnick, tnp, "Success! %s has been added to '%s' "
                         "(contact #help if you require further assistance).",
-                        RQ_SNICK, req->cip->name->content);
+                        rq_snick->content, req->cip->name->content);
 
       /* auth */
       user = (sstring *)getcopyconfigitem("request", "user", "R", 30);
@@ -298,7 +298,7 @@ static int qr_checksize(chanindex *cip, int what, char *failcode) {
 
   /* make sure we can actually add Q */
   if (what == QR_CSERVE) {
-    qbot = getnickbynick(RQ_QNICK);
+    qbot = getnickbynick(rq_qnick->content);
 
     if (!qbot)
       return 0;
@@ -405,7 +405,7 @@ void qr_handle_notice(nick *sender, char *message) {
   int delrequest = 0, state, who;
   requestrec *nextreq;
 
-  if (!ircd_strcmp(sender->nick, RQ_QNICK) && nextqreq) {
+  if (!ircd_strcmp(sender->nick, rq_qnick->content) && nextqreq) {
     /* Message from Q */
     if (!ircd_strcmp(message,"Done.")) {
       /* Q added the channel: delete from L and tell the user. */
@@ -431,7 +431,7 @@ void qr_handle_notice(nick *sender, char *message) {
     }
   }
 
-  if (!ircd_strcmp(sender->nick, RQ_QNICK)) {
+  if (!ircd_strcmp(sender->nick, rq_qnick->content)) {
     who = QR_Q;
     state = (who == QR_Q) ? rqstate : rlstate;
     nextreq = (who == QR_Q) ? nextreqq : nextreql;
@@ -616,7 +616,7 @@ void qr_handle_notice(nick *sender, char *message) {
               qr_result(nextreq, QR_OK, '-', "OK");
             } else {
                 qr_result(nextreq, QR_FAILED, failcode,
-                          "Error: Sorry, Your channel '%s' does not require %s. Please try again in a few days.", nextreq->cip->name->content, RQ_SNICK);
+                          "Error: Sorry, Your channel '%s' does not require %s. Please try again in a few days.", nextreq->cip->name->content, rq_snick->content);
        
               qr_toosmall++;
             }
@@ -763,7 +763,7 @@ int qr_requests(nick *rqnick, nick *sender, channel *cp, nick *qnick) {
   sendnoticetouser(rqnick, sender,
                    "Checking your %s access in '%s'. "
                    "This may take a while, please be patient...",
-                   RQ_QNICK, cip->name->content);
+                   rq_qnick->content, cip->name->content);
 
   return RQ_UNKNOWN;
 }
index 820a4a600ac9b1c66236f10a7752542598fc0a77..9fd092d3ad2a57fa41ee092f7e4c1d7c4cfc80be 100644 (file)
@@ -322,7 +322,7 @@ static int trusts_cmdtrustspew(void *source, int cargc, char **cargv) {
     return CMD_USAGE;
 
   tree = NSASTNode(tgroup_parse, NSASTLiteral(cargv[0]));
-  return ast_nicksearch(&tree, controlreply, sender, NULL, printnick_channels, NULL, NULL, 2000);
+  return ast_nicksearch(&tree, controlreply, sender, NULL, printnick_channels, NULL, NULL, 2000, NULL);
 }
 
 static int commandsregistered;
index 8aaa56840908e049def24ded3e05a43efb5b9896..4520fb5af633f09ff8db9a03bc1d3d0d6e2c89ca 100644 (file)
@@ -8,8 +8,8 @@
 #include "../core/schedule.h"
 #include "../irc/irc.h"
 #include "../lib/stringbuf.h"
-#include "../noperserv/noperserv.h"
-#include "../noperserv/noperserv_policy.h"
+#include "../control/control.h"
+#include "../control/control_policy.h"
 #include "trusts.h"
 
 MODULE_VERSION("");