1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-30 19:26:37 +02:00

- internal: Modified TKL system (getting ready for anti-spam system):

Instead of 1 big list of *lines, it's now an array to easily distinct between types.
  Also made tk->usermask static (USERLEN+2) instead of dynamic.
  These changes should give enough speed improvement to make the new anti-spam/anti-ads
  feature fast enough.
This commit is contained in:
Bram Matthys
2004-01-01 22:53:50 +00:00
parent 081056522e
commit 56cb95f189
4 changed files with 145 additions and 73 deletions
+5 -1
View File
@@ -2683,4 +2683,8 @@ seen. gmtime warning still there
- Added some additional warnings for insane large values for allow::maxperip, and class::*
stuff. Reported by Erik_Rana (#0001463).
- Fixed a bug with /rehash and cached remote includes reported by mustapha88
- internal: Modified TKL system (getting ready for anti-spam system):
Instead of 1 big list of *lines, it's now an array to easily distinct between types.
Also made tk->usermask static (USERLEN+2) instead of dynamic.
These changes should give enough speed improvement to make the new anti-spam/anti-ads
feature fast enough.
+7 -2
View File
@@ -729,8 +729,11 @@ struct Server {
struct t_kline {
aTKline *prev, *next;
int type;
char *usermask, *hostmask, *reason, *setby;
int type;
unsigned short subtype; /* these 2 are only used.. */
unsigned short action; /* ..for anti-spam TKL's */
char usermask[USERLEN+2]; /* room for '*' and a nul byte [usually 10+2=12] */
char *hostmask, *reason, *setby;
TS expire_at, set_at;
};
@@ -1624,6 +1627,8 @@ int throttle_can_connect(struct IN_ADDR *in);
#define BANCHK_MSG 1 /* checking if a ban forbids the person from sending messages */
#define BANCHK_NICK 2 /* checking if a ban forbids the person from changing his/her nick */
#define TKLISTLEN 26
#endif /* __struct_include__ */
#include "dynconf.h"
+2
View File
@@ -156,6 +156,7 @@ void server_reboot(char *);
void restart(char *);
static void open_debugfile(), setup_signals();
extern void init_glines(void);
extern void tkl_init(void);
TS last_garbage_collect = 0;
char **myargv;
@@ -858,6 +859,7 @@ int InitwIRCD(int argc, char *argv[])
#ifdef USE_LIBCURL
url_init();
#endif
tkl_init();
umode_init();
#ifdef EXTCMODE
extcmode_init();
+131 -70
View File
@@ -40,17 +40,66 @@
#include "h.h"
#include "proto.h"
aTKline *tklines[TKLISTLEN];
aTKline *tklines = NULL;
#define AllocCpy(x,y) x = (char *) MyMalloc(strlen(y) + 1); strcpy(x,y)
#define GFreeStr(x) MyFree((char *) x)
#define GFreeGline(x) MyFree((aGline *) x)
extern char zlinebuf[BUFSIZE];
/*
/** tkl hash method.
* NOTE1: the input value 'c' is assumed to be in range a-z or A-Z!
* NOTE2: don't blindly change the hashmethod, some things depend on
* 'z'/'Z' getting the same bucket.
*/
inline int tkl_hash(char c)
{
#ifdef DEBUGMODE
if ((c >= 'a') && (c <= 'z'))
return c-'a';
else if ((c >= 'A') && (c <= 'Z'))
return c-'A';
else {
sendto_realops("[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c);
ircd_log(LOG_ERROR, "[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c);
return 0;
}
#else
return (isupper(c) ? c-'A' : c-'a');
#endif
}
* type = TKL_*
/** tkl type to tkl character.
* NOTE: type is assumed to be valid.
*/
char tkl_typetochar(int type)
{
if (type & TKL_GLOBAL)
{
if (type & TKL_KILL)
return 'G';
if (type & TKL_ZAP)
return 'Z';
if (type & TKL_SHUN)
return 's';
if (type & TKL_KILL)
return 'G';
} else {
if (type & TKL_ZAP)
return 'z';
if (type & TKL_KILL)
return 'k';
}
sendto_realops("[BUG]: tkl_typetochar(): unknown type 0x%x !!!", type);
ircd_log(LOG_ERROR, "[BUG] tkl_typetochar(): unknown type 0x%x !!!", type);
return 0;
}
void tkl_init(void)
{
memset(tklines, 0, sizeof(tklines));
}
/*
* type = TKL_*
* usermask@hostmask
* reason
* setby = whom set it
@@ -61,6 +110,7 @@ extern char zlinebuf[BUFSIZE];
int tkl_add_line(int type, char *usermask, char *hostmask, char *reason, char *setby, TS expire_at, TS set_at)
{
aTKline *nl;
int index;
nl = (aTKline *) MyMalloc(sizeof(aTKline));
@@ -70,34 +120,36 @@ int tkl_add_line(int type, char *usermask, char *hostmask, char *reason, char *
nl->type = type;
nl->expire_at = expire_at;
nl->set_at = set_at;
AllocCpy(nl->usermask, usermask);
AllocCpy(nl->hostmask, hostmask);
AllocCpy(nl->reason, reason);
AllocCpy(nl->setby, setby);
AddListItem(nl, tklines);
strncpyzt(nl->usermask, usermask, sizeof(nl->usermask));
nl->hostmask = strdup(hostmask);
nl->reason = strdup(reason);
nl->setby = strdup(setby);
index = tkl_hash(tkl_typetochar(type));
AddListItem(nl, tklines[index]);
return 0;
}
aTKline *tkl_del_line(aTKline *tkl)
{
aTKline *p, *q;
int i;
for (p = tklines; p; p = p->next)
{
if (p == tkl)
/* perhaps speed this up -- syz/'04 */
for (i = 0; i < TKLISTLEN; i++)
for (p = tklines[i]; p; p = p->next)
{
q = p->next;
GFreeStr(p->hostmask);
GFreeStr(p->usermask);
GFreeStr(p->reason);
GFreeStr(p->setby);
DelListItem(p, tklines);
MyFree((aTKline *) p);
return q;
if (p == tkl)
{
q = p->next;
MyFree(p->hostmask);
MyFree(p->reason);
MyFree(p->setby);
DelListItem(p, tklines[i]);
MyFree(p);
return q;
}
}
}
return NULL;
}
/*
@@ -219,17 +271,19 @@ EVENT(tkl_check_expire)
{
aTKline *gp, *next;
TS nowtime;
int index;
nowtime = TStime();
for (gp = tklines; gp; gp = next)
{
next = gp->next;
if (gp->expire_at <= nowtime && !(gp->expire_at == 0))
for (index = 0; index < TKLISTLEN; index++)
for (gp = tklines[index]; gp; gp = next)
{
tkl_expire(gp);
next = gp->next;
if (gp->expire_at <= nowtime && !(gp->expire_at == 0))
{
tkl_expire(gp);
}
}
}
}
@@ -249,6 +303,7 @@ int find_tkline_match(aClient *cptr, int xx)
ConfigItem_except *excepts;
char host[NICKLEN+USERLEN+HOSTLEN+6], host2[NICKLEN+USERLEN+HOSTLEN+6];
int match_type = 0;
int index;
if (IsServer(cptr) || IsMe(cptr))
return -1;
@@ -257,20 +312,22 @@ int find_tkline_match(aClient *cptr, int xx)
cname = cptr->user ? cptr->user->username : "unknown";
cip = (char *)Inet_ia2p(&cptr->ip);
for (lp = tklines; lp; lp = lp->next)
points = 0;
for (index = 0; index < TKLISTLEN; index++)
{
points = 0;
if (lp->type & TKL_SHUN)
continue;
if (!match(lp->usermask, cname) && !match(lp->hostmask, chost))
points = 1;
if (!match(lp->usermask, cname) && !match(lp->hostmask, cip))
points = 1;
if (points == 1)
for (lp = tklines[index]; lp; lp = lp->next)
{
if (lp->type & TKL_SHUN)
continue;
if (!match(lp->usermask, cname) && !match(lp->hostmask, chost))
points = 1;
if (!match(lp->usermask, cname) && !match(lp->hostmask, cip))
points = 1;
if (points)
break;
}
if (points)
break;
else
points = 0;
}
if (points != 1)
@@ -355,7 +412,7 @@ int find_shun(aClient *cptr)
cip = (char *)Inet_ia2p(&cptr->ip);
for (lp = tklines; lp; lp = lp->next)
for (lp = tklines[tkl_hash('s')]; lp; lp = lp->next)
{
points = 0;
@@ -403,7 +460,7 @@ int find_tkline_match_zap(aClient *cptr)
nowtime = TStime();
cip = (char *)Inet_ia2p(&cptr->ip);
for (lp = tklines; lp; lp = lp->next)
for (lp = tklines[tkl_hash('z')]; lp; lp = lp->next)
{
if (lp->type & TKL_ZAP)
{
@@ -500,6 +557,7 @@ void tkl_stats(aClient *cptr, int type, char *para)
aTKline *tk;
TS curtime;
TKLFlag tklflags;
int index;
/*
We output in this row:
Glines,GZlines,KLine, ZLIne
@@ -511,8 +569,9 @@ void tkl_stats(aClient *cptr, int type, char *para)
parse_tkl_para(para, &tklflags);
tkl_check_expire(NULL);
curtime = TStime();
for (tk = tklines; tk; tk = tk->next)
{
for (index = 0; index < TKLISTLEN; index++)
for (tk = tklines[index]; tk; tk = tk->next)
{
if (type && tk->type != type)
continue;
if (!BadPtr(para))
@@ -578,7 +637,7 @@ void tkl_stats(aClient *cptr, int type, char *para)
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
}
}
}
@@ -586,25 +645,27 @@ void tkl_synch(aClient *sptr)
{
aTKline *tk;
char typ = 0;
for (tk = tklines; tk; tk = tk->next)
{
if (tk->type & TKL_GLOBAL)
int index;
for (index = 0; index < TKLISTLEN; index++)
for (tk = tklines[index]; tk; tk = tk->next)
{
if (tk->type & TKL_KILL)
typ = 'G';
if (tk->type & TKL_ZAP)
typ = 'Z';
if (tk->type & TKL_SHUN)
typ = 's';
sendto_one(sptr,
":%s %s + %c %s %s %s %li %li :%s", me.name,
IsToken(sptr) ? TOK_TKL : MSG_TKL,
typ,
tk->usermask, tk->hostmask, tk->setby,
tk->expire_at, tk->set_at, tk->reason);
if (tk->type & TKL_GLOBAL)
{
if (tk->type & TKL_KILL)
typ = 'G';
if (tk->type & TKL_ZAP)
typ = 'Z';
if (tk->type & TKL_SHUN)
typ = 's';
sendto_one(sptr,
":%s %s + %c %s %s %s %li %li :%s", me.name,
IsToken(sptr) ? TOK_TKL : MSG_TKL,
typ,
tk->usermask, tk->hostmask, tk->setby,
tk->expire_at, tk->set_at, tk->reason);
}
}
}
}
/*
@@ -627,6 +688,7 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[])
char gmt[256], gmt2[256];
char txt[256];
TS expiry_1, setat_1;
int index;
if (!IsServer(sptr) && !IsOper(sptr) && !IsMe(sptr))
@@ -660,12 +722,11 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[])
return 0;
found = 0;
for (tk = tklines; tk; tk = tk->next)
for (tk = tklines[tkl_hash(parv[2][0])]; tk; tk = tk->next)
{
if (tk->type == type)
{
if (!strcmp(tk->hostmask, parv[4])
&& !strcmp(tk->usermask, parv[3]))
if (!strcmp(tk->hostmask, parv[4]) && !strcmp(tk->usermask, parv[3]))
{
found = 1;
break;
@@ -776,7 +837,7 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[])
}
found = 0;
for (tk = tklines; tk; tk = tk->next)
for (tk = tklines[tkl_hash(parv[2][0])]; tk; tk = tk->next)
{
if (tk->type == type)
{