]> jfr.im git - irc/quakenet/newserv.git/blobdiff - bans/bans.c
add is_normalized_ipmask
[irc/quakenet/newserv.git] / bans / bans.c
index b98f7ae79eef44be92433e08af32d98f8f37f235..137308638a701ed4aeeb649948854cf22c4ba5ac 100644 (file)
@@ -10,6 +10,9 @@
 #include "../irc/irc_config.h"
 #include "../core/nsmalloc.h"
 #include "../lib/flags.h"
+#include "../lib/version.h"
+
+MODULE_VERSION("")
 
 #define ALLOCUNIT 100
 
@@ -73,6 +76,7 @@ chanban *makeban(const char *mask) {
   int i;
   int checklen;
   chanban *cbp;
+  char tmpbuf[512];
   
   cbp=getchanban();  
   len=strlen(mask);
@@ -94,8 +98,10 @@ chanban *makeban(const char *mask) {
       /* Got @ sign: everything after here is host */
       if ((len-i)-1 > HOSTLEN) {
         /* This is too long, we need to truncate it */
-        cbp->host=getsstring(&mask[len-HOSTLEN],HOSTLEN);
-        cbp->host->content[0]='*';
+        strncpy(tmpbuf,&mask[len-HOSTLEN],HOSTLEN);
+        tmpbuf[HOSTLEN]='\0';
+        tmpbuf[0]='*';
+        cbp->host=getsstring(tmpbuf,HOSTLEN);
         cbp->flags |= CHANBAN_HOSTMASK;
       } else if (i==(len-1)) {
         /* Ban ending with @, just mark it invalid */
@@ -264,8 +270,10 @@ chanban *makeban(const char *mask) {
       cbp->user=NULL;
     } else if (foundat - foundbang - 1 > USERLEN) {
       /* It's too long.. */
-      cbp->user=getsstring(&mask[foundat-USERLEN],USERLEN);
-      cbp->user->content[0]='*';
+      strncpy(tmpbuf,&mask[foundat-USERLEN],USERLEN);
+      tmpbuf[USERLEN]='\0';
+      tmpbuf[0]='*';
+      cbp->user=getsstring(tmpbuf,USERLEN);
       cbp->flags |= CHANBAN_USERMASK;
     } else if ((foundat - foundbang - 1 == 1) && mask[foundbang+1]=='*') {
       cbp->user=NULL;
@@ -277,6 +285,10 @@ chanban *makeban(const char *mask) {
       else
         cbp->flags |= CHANBAN_USEREXACT;
     }
+    /* Username part can't contain an @ */
+    if (cbp->user && strchr(cbp->user->content,'@')) {
+      cbp->flags |= CHANBAN_INVALID;
+    }
   }
 
   assert(cbp->flags & (CHANBAN_USEREXACT | CHANBAN_USERMASK | CHANBAN_USERANY | CHANBAN_USERNULL));