From ae31e19f92e717919ac8e3db9039eb38d2b89aae Mon Sep 17 00:00:00 2001 From: in2 Date: Thu, 7 Mar 2002 15:13:44 +0000 Subject: Initial revision git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- util/antispam.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 util/antispam.c (limited to 'util/antispam.c') diff --git a/util/antispam.c b/util/antispam.c new file mode 100644 index 00000000..f7b77569 --- /dev/null +++ b/util/antispam.c @@ -0,0 +1,122 @@ +/* $Id: antispam.c,v 1.1 2002/03/07 15:13:45 in2 Exp $ */ +/* 抓廣告信的程式 */ +#include +#include +#include +#include +#include "config.h" + +#define WINDOW 100 /* 一次window多少個server */ +#define LEVEL 21 /* 若幾次重復就算廣告信 */ + +#define mailog BBSHOME "/etc/mailog" +#define spamlog BBSHOME "/etc/spam" + +typedef struct sendinfo +{ + char time[18]; + char from[50]; + char userid[20]; + int count; +} +sendinfo; + +int + main() +{ + char buf[200], *from, *userid; + int num = -1, numb = -1, n, nb; + FILE *fp = fopen(mailog, "r"), *fo; + sendinfo data[WINDOW]; + sendinfo bad[WINDOW]; + + unlink(spamlog); + fo = fopen(spamlog, "a"); + memset(data, 0, sizeof(data)); + memset(bad, 0, sizeof(bad)); + + if (!fp || !fo) + return 0; + + while (fgets(buf, 200, fp)) + { + strtok(buf, "\r\n"); + from = strchr(buf, '>') + 2; + userid = strstr(buf, " =>"); + + if (!from || !userid) + continue; + + *userid = 0; + userid += 4; + + if (strstr(from, "MAILER-DAEMON") + || strstr(from, userid)) + continue; /* 退信通知不管 */ + /* 是否已是badhost */ + + for (nb = 0; nb < WINDOW && bad[nb].from[0]; nb++) + if (!strcmp(bad[nb].from, from)) + break; + + if (nb < WINDOW && bad[nb].from[0]) + { + bad[nb].count++; + continue; + } + + /* 簡查過去記錄 */ + + for (n = 0; n < WINDOW && data[n].from[0]; n++) + if (!strcmp(data[n].from, from)) + break; + + if (n < WINDOW && data[n].from[0]) + { + if (!strncmp(data[n].userid, userid, 20)) + continue; + /* 轉給同一個人就不管 */ + strncpy(data[n].userid, userid, 20); + if (++data[n].count >= LEVEL) + { + /* 變成bad 移data到bad 空缺由後一筆資料補上 */ + if (nb >= WINDOW) + { + numb = (numb + 1) % WINDOW; + nb = numb; + fprintf(fo, "%s %s 重覆寄 %d 次\n", + bad[nb].time, bad[nb].from, bad[nb].count); +/* printf(" %s send %d times\n", + bad[nb].from, bad[nb].count); */ + } + memcpy(&bad[nb], &data[n], sizeof(sendinfo)); + memcpy(&data[n], &data[n + 1], sizeof(sendinfo) * (WINDOW - n - 1)); + if (num > n) + num--; + } + } + else + { + if (n >= WINDOW) + { + num = (num + 1) % WINDOW; + n = num; + } +/* printf("[%s] to [%s]\n", from, userid); */ + buf[17] = 0; + strncpy(data[n].time, buf, 17); + strncpy(data[n].from, from, 50); + strncpy(data[n].userid, userid, 20); + } + } + + for (nb = 0; nb < WINDOW && bad[nb].from[0]; nb++) + { + fprintf(fo, "%s %s 重覆寄 %d 次\n", bad[nb].time, + bad[nb].from, bad[nb].count); +/* printf(" %s send %d times\n", bad[nb].from, bad[nb].count); */ + } + fclose(fp); + fclose(fo); + return 0; +} -- cgit v1.2.3