summaryrefslogtreecommitdiffstats
path: root/util/antispam.c
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
commitae31e19f92e717919ac8e3db9039eb38d2b89aae (patch)
treec70164d6a1852344f44b04a653ae2815043512af /util/antispam.c
downloadpttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.gz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.bz2
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.lz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.xz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.zst
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.zip
Initial revision
git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'util/antispam.c')
-rw-r--r--util/antispam.c122
1 files changed, 122 insertions, 0 deletions
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 <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#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;
+}