MODULE_VERSION("");
-static void glines_sched_save(void *arg);
-
void _init() {
/* If we're connected to IRC, force a disconnect. */
if (connected) {
irc_send("%s SQ %s 0 :Resync [adding gline support]", mynumeric->content, myserver->content);
- irc_disconnected();
+ irc_disconnected(0);
}
registerserverhandler("GL", handleglinemsg, 6);
registerhook(HOOK_CORE_STATSREQUEST, handleglinestats);
-
- schedulerecurring(time(NULL), 0, GLSTORE_SAVE_INTERVAL, &glines_sched_save, NULL);
-
- glstore_load();
}
void _fini() {
deregisterserverhandler("GL", handleglinemsg);
deregisterhook(HOOK_CORE_STATSREQUEST, handleglinestats);
-
- deleteschedule(NULL, glines_sched_save, NULL);
-}
-
-static void glines_sched_save(void *arg) {
- glstore_save();
}
int gline_match_nick(gline *gl, nick *np) {
return 0;
if (gl->flags & GLINE_IPMASK) {
- if (!ipmask_check(&gl->ip, &np->p_ipaddr, gl->bits))
+ if (!ipmask_check(&gl->ip, &np->ipaddress, gl->bits))
return 0;
} else {
if (gl->host && match(gl->host->content, np->host->name->content) != 0)
}
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 : "");
}
}
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;
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;
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.";
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;
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;
+}