]> jfr.im git - irc/quakenet/newserv.git/blobdiff - glines/glines.c
Make glist behave the way it should.
[irc/quakenet/newserv.git] / glines / glines.c
index b7b4f125881fb1500bb16b3d7da69d0cdf7531b4..63d51b209973d1428d579c6d879c1e29a0e3bc95 100644 (file)
@@ -11,8 +11,6 @@
 
 MODULE_VERSION("");
 
-static void glines_sched_save(void *arg);
-
 void _init() {
   /* If we're connected to IRC, force a disconnect. */
   if (connected) {
@@ -159,47 +157,44 @@ void gline_destroy(gline *agline, time_t lastmod, int propagate) {
 }
 
 void gline_propagate(gline *agline) {
+  /* Don't propagate Ulined glines. */
+  if (agline->lastmod == 0) {
+    Error("gline", ERR_WARNING, "Tried to propagate gline with lastmod == 0: %s", glinetostring(agline));
+    return;
+  }
+
+#if SNIRCD_VERSION >= 140
+#error TODO: implement 6 parameter glines for snircd >=1.4.0
+#endif /* SNIRCD_VERSION */
+
   if (agline->flags & GLINE_DESTROYED) {
-    controlwall(NO_OPER, NL_GLINES, "Destroying G-Line on '%s' lasting %s with reason '%s', created by: %s",
+#if SNIRCD_VERSION < 135
+    controlwall(NO_OPER, NL_GLINES_AUTO, "Tried to destroy G-Line on '%s' however SNIRCD_VERSION is too old.", glinetostring(agline));
+#else
+    controlwall(NO_OPER, NL_GLINES_AUTO, "Destroying G-Line on '%s' lasting %s with reason '%s', created by: %s",
       glinetostring(agline), longtoduration(agline->expire-getnettime(), 0),
-      agline->reason->content, agline->creator->content);
+      agline->reason ? agline->reason->content : "", agline->creator->content);
 
-#if 1
     irc_send("%s GL * %%-%s %lu %lu :%s\r\n", mynumeric->content,
       glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#else
-    controlwall(NO_OPER, NL_GLINES, "%s GL * %%-%s %lu %lu :%s\r\n", mynumeric->content,
-      glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#endif
+      agline->lastmod, agline->reason ? agline->reason->content : "");
+#endif /* SNIRCD_VERSION */
   } else if (agline->flags & GLINE_ACTIVE) {
-    controlwall(NO_OPER, NL_GLINES, "Activating G-Line on '%s' lasting %s with reason '%s', created by: %s",
+    controlwall(NO_OPER, NL_GLINES_AUTO, "Activating G-Line on '%s' lasting %s created by %s with reason '%s'",
       glinetostring(agline), longtoduration(agline->expire-getnettime(), 0),
-      agline->reason->content, agline->creator->content);
+      agline->creator->content, agline->reason ? agline->reason->content : "");
 
-#if 1
     irc_send("%s GL * +%s %lu %lu :%s\r\n", mynumeric->content,
       glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#else
-    controlwall(NO_OPER, NL_GLINES, "%s GL * +%s %lu %lu :%s\r\n", mynumeric->content,
-      glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#endif
+      agline->lastmod, agline->reason ? agline->reason->content : "");
   } else {
-    controlwall(NO_OPER, NL_GLINES, "Deactivating G-Line on '%s'",
-      glinetostring(agline));
+    controlwall(NO_OPER, NL_GLINES_AUTO, "Deactivating G-Line on '%s' lasting %s created by %s with reason '%s'",
+      glinetostring(agline), longtoduration(agline->expire-getnettime(), 0),
+      agline->creator->content, agline->reason ? agline->reason->content : "");
 
-#if 1
     irc_send("%s GL * -%s %lu %lu :%s\r\n", mynumeric->content,
       glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#else
-    controlwall(NO_OPER, NL_GLINES, "%s GL * -%s %lu %lu :%s\r\n", mynumeric->content,
-      glinetostring(agline), agline->expire - getnettime(),
-      agline->lastmod, agline->reason->content);
-#endif
+      agline->lastmod, agline->reason ? agline->reason->content : "");
   }
 }
 
@@ -251,9 +246,6 @@ int gline_match_mask(gline *gla, gline *glb) {
   if ((gla->flags & GLINE_REALNAME) != (glb->flags & GLINE_REALNAME))
     return 0;
 
-  if ((gla->flags & GLINE_IPMASK) != (glb->flags & GLINE_IPMASK))
-    return 0;
-
   if (gla->nick && !glb->nick)
     return 0;
 
@@ -266,7 +258,7 @@ int gline_match_mask(gline *gla, gline *glb) {
   if (gla->user && glb->user && match(gla->user->content, glb->user->content) != 0)
     return 0;
 
-  if (gla->flags & GLINE_IPMASK) {
+  if (gla->flags & GLINE_IPMASK && glb->flags & GLINE_IPMASK) {
     if (gla->bits > glb->bits)
       return 0;
 
@@ -288,6 +280,18 @@ int isglinesane(gline *gl, const char **hint) {
   char *pos;
   trusthost *th;
 
+  /* Reason is too short */
+  if (!gl->reason || strlen(gl->reason->content) < MINGLINEREASONLEN) {
+    *hint = "G-Line reason is too short.";
+    return 0;
+  }
+
+  /* Duration is too long */
+  if (gl->expire - getnettime() > MAXGLINEDURATION) {
+    *hint = "G-Line duration is too long.";
+    return 0;
+  }
+
   /* Hits all realnames. */
   if ((gl->flags & GLINE_REALNAME) && !gl->user) {
     *hint = "Matches all realnames.";
@@ -300,6 +304,15 @@ int isglinesane(gline *gl, const char **hint) {
     return 0;
   }
 
+  /* Hostmask is too long. */
+  if (!(gl->flags & (GLINE_BADCHAN | GLINE_REALNAME)) &&
+      ((gl->nick && strlen(gl->nick->content) > NICKLEN) ||
+       (gl->user && strlen(gl->user->content) > USERLEN) ||
+       (gl->host && strlen(gl->host->content) > HOSTLEN))) {
+    *hint = "Hostmask components are too long.";
+    return 0;
+  }
+  
   /* Skip the other checks for nickname glines. */
   if (gl->nick)
     return 1;
@@ -362,3 +375,35 @@ int isglinesane(gline *gl, const char **hint) {
 
   return 1;
 }
+
+gline *glinedup(gline *gl) {
+  gline *sgl;
+
+  sgl = newgline();
+
+  if (!sgl)
+    return NULL;
+
+  if (gl->nick)
+    sgl->nick = getsstring(gl->nick->content, 512);
+
+  if (gl->user)
+    sgl->user = getsstring(gl->user->content, 512);
+
+  if (gl->host)
+    sgl->host = getsstring(gl->host->content, 512);
+
+  sgl->reason = gl->reason ? getsstring(gl->reason->content, 512) : NULL;
+  sgl->creator = getsstring(gl->creator->content, 512);
+
+  memcpy(&sgl->ip, &gl->ip, sizeof(gl->ip));
+  sgl->bits = gl->bits;
+
+  sgl->expire = gl->expire;
+  sgl->lastmod = gl->lastmod;
+  sgl->lifetime = gl->lifetime;
+
+  sgl->flags = gl->flags;
+
+  return sgl;
+}