]> jfr.im git - irc/quakenet/newserv.git/blobdiff - noperserv/noperserv_hooks.c
Update .hgignore.
[irc/quakenet/newserv.git] / noperserv / noperserv_hooks.c
index a47f796f24a9c8de11f5fff4c75772ed8a92e13d..3df5e8739c1a57a0f7226f4db160cfd95add499c 100644 (file)
@@ -19,8 +19,8 @@
 struct storedhook {
   CommandHandler old;
   sstring *name;
-  char *oldhelp;
-  char *newhelp;
+  cmdhelp *oldhelp;
+  cmdhelp *newhelp;
   struct storedhook *next;
 } storedhook;
 
@@ -32,6 +32,7 @@ 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);
@@ -42,7 +43,7 @@ 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, ...);
+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;
@@ -57,6 +58,9 @@ void noperserv_setup_hooks(void) {
   oldwall = controlwall;
   controlwall = &noperserv_wall;
 
+  oldpermitted = controlpermitted;
+  controlpermitted = &noperserv_policy_command_permitted;
+
   memset(&special, 0, sizeof(struct specialsched));
 
   if(!mynick) {
@@ -87,15 +91,20 @@ int noperserv_hook_command(char *command, CommandHandler newcommand, char *newhe
 
   newhook->old = fetchcommand->handler;
   if(newhelp) {
-    int len = strlen(newhelp) + 1;
-    newhook->newhelp = (char *)malloc(len);
+    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;
     }
-    strlcpy(newhook->newhelp, newhelp, len);
-    newhook->oldhelp = fetchcommand->help;
-    fetchcommand->help = newhook->newhelp;
   } else {
     newhook->newhelp = NULL;
   }
@@ -116,7 +125,9 @@ void noperserv_unhook_all_commands(void) {
     if(ch->old && (fetchcommand = findcommandintree(controlcmds, ch->name->content, 1))) {
       fetchcommand->handler = ch->old;
       if(ch->newhelp) {
-        fetchcommand->help = ch->oldhelp;
+        fetchcommand->ext = ch->oldhelp;
+        if ( ((cmdhelp *)ch->newhelp)->helpstr)
+          free( ((cmdhelp *)ch->newhelp)->helpstr);
         free(ch->newhelp);
       }
     }
@@ -136,14 +147,19 @@ void noperserv_cleanup_hooks(void) {
     firsttime = 0;
   }
 
-  if(oldhandler)
+  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;
@@ -171,7 +187,7 @@ int noperserv_modules_loaded(char *mask) {
   int i;
   char *ptr;
 
-  for(i=0,ptr=lsmod(i);ptr;ptr=lsmod(++i))
+  for(i=0,ptr=lsmod(i,NULL,NULL,NULL);ptr;ptr=lsmod(++i,NULL,NULL,NULL))
     if(match2strings(mask, ptr))
       return 1;
 
@@ -187,10 +203,6 @@ int noperserv_specialmod(nick *np, char *command, ScheduleCallback reloadhandler
   }
 
   if(!strcmp(cargv[0], "noperserv")) {
-    if(noperserv_modules_loaded("noperserv_*")) {
-      controlreply(np, "NOT UNLOADING. Unload all dependencies first.");
-      return CMD_ERROR;
-    }
     if(special.schedule) {
       controlreply(np, "Previous attempt at un/reload still in progress.");
       return CMD_OK;
@@ -279,7 +291,7 @@ int noperserv_showcommands(void *sender, int cargc, char **cargv) {
   
   for(i=0;i<n;i++)
     if(noperserv_policy_command_permitted(cmdlist[i]->level, np))
-      controlreply(np, "%s (%s)", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
+      controlreply(np, " %-25s %s", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
 
   controlreply(np, "End of list.");
   return CMD_OK;
@@ -387,14 +399,14 @@ void noperserv_handle_messages(nick *target, int messagetype, void **args) {
                
       cmd = findcommandintree(controlcmds,cargv[0],1);
       if(!cmd) {
-        controlreply(sender, "Unknown command.");
+        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, "Access denied.");
+        controlreply(sender, "Unknown command or access denied.");
         return;
       }
 
@@ -440,13 +452,8 @@ int noperserv_help(void *sender, int cargc, char **cargv) {
     return CMD_USAGE;
 
   cmd = findcommandintree(controlcmds, cargv[0], 1);
-  if(!cmd) {
-    controlreply(np, "Unknown command.");
-    return CMD_ERROR;
-  }
-  
-  if(!noperserv_policy_command_permitted(cmd->level, np)) {
-    controlreply(np, "Access denied.");
+  if(!cmd || !noperserv_policy_command_permitted(cmd->level, np)) {
+    controlreply(np, "Unknown command or access denied.");
     return CMD_ERROR;
   }
 
@@ -468,7 +475,7 @@ void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ..
   Error("noperserv", ERR_INFO, "$%s$ %s", flags, buf);
 
   for(;au;au=au->next) {
-    if(NOGetNoticeLevel(au) & noticelevel) {
+    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);