summaryrefslogtreecommitdiffstats
path: root/util/antispam.c
blob: e29549aa3cbec166494061aa0e624c345fc0fa32 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* $Id: antispam.c,v 1.2 2003/07/20 00:55:34 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(int argc, char **argv)
{
    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;
}