Statistics
| Branch: | Tag: | Revision:

root / src / sylfilter.c @ cfadedec

History | View | Annotate | Download (5.1 kB)

1 4012ec30 Hiroyuki Yamamoto
#include <stdio.h>
2 faa55f07 Hiroyuki Yamamoto
#include <string.h>
3 5a583287 Hiroyuki Yamamoto
#include <locale.h>
4 4012ec30 Hiroyuki Yamamoto
5 4012ec30 Hiroyuki Yamamoto
#include "filter.h"
6 4012ec30 Hiroyuki Yamamoto
#include "filter-manager.h"
7 ff656913 Hiroyuki Yamamoto
#include "filter-utils.h"
8 761f2955 Hiroyuki Yamamoto
#include "filter-kvs.h"
9 761f2955 Hiroyuki Yamamoto
10 761f2955 Hiroyuki Yamamoto
#define USE_QDBM 1
11 761f2955 Hiroyuki Yamamoto
#ifdef USE_QDBM
12 761f2955 Hiroyuki Yamamoto
#  include "filter-kvs-qdbm.h"
13 761f2955 Hiroyuki Yamamoto
#endif
14 761f2955 Hiroyuki Yamamoto
15 4012ec30 Hiroyuki Yamamoto
#include "textcontent-filter.h"
16 4012ec30 Hiroyuki Yamamoto
#include "blacklist-filter.h"
17 4012ec30 Hiroyuki Yamamoto
#include "whitelist-filter.h"
18 4012ec30 Hiroyuki Yamamoto
#include "wordsep-filter.h"
19 4012ec30 Hiroyuki Yamamoto
#include "ngram-filter.h"
20 4012ec30 Hiroyuki Yamamoto
#include "bayes-filter.h"
21 4012ec30 Hiroyuki Yamamoto
22 4cab1247 Hiroyuki Yamamoto
enum {
23 4cab1247 Hiroyuki Yamamoto
        MODE_TEST_JUNK,
24 4cab1247 Hiroyuki Yamamoto
        MODE_LEARN_JUNK,
25 4cab1247 Hiroyuki Yamamoto
        MODE_LEARN_CLEAN,
26 af7ecefa Hiroyuki Yamamoto
        MODE_SHOW_STATUS
27 4cab1247 Hiroyuki Yamamoto
};
28 4cab1247 Hiroyuki Yamamoto
29 0113a62c Hiroyuki Yamamoto
30 0113a62c Hiroyuki Yamamoto
static int verbose = 0;
31 0113a62c Hiroyuki Yamamoto
32 4cab1247 Hiroyuki Yamamoto
static int learn_filter(int mode, const char *file);
33 4cab1247 Hiroyuki Yamamoto
static int test_filter(int mode, const char *file);
34 295ccf38 Hiroyuki Yamamoto
static void print_message_data(XMessageData *msgdata);
35 4cab1247 Hiroyuki Yamamoto
36 4cab1247 Hiroyuki Yamamoto
37 4012ec30 Hiroyuki Yamamoto
int main(int argc, char *argv[])
38 4012ec30 Hiroyuki Yamamoto
{
39 4cab1247 Hiroyuki Yamamoto
        int retval = 0;
40 4cab1247 Hiroyuki Yamamoto
        int i;
41 4cab1247 Hiroyuki Yamamoto
        int mode = MODE_TEST_JUNK;
42 4cab1247 Hiroyuki Yamamoto
43 4cab1247 Hiroyuki Yamamoto
        setlocale(LC_ALL, "");
44 4cab1247 Hiroyuki Yamamoto
45 4cab1247 Hiroyuki Yamamoto
        xfilter_init();
46 4cab1247 Hiroyuki Yamamoto
47 4cab1247 Hiroyuki Yamamoto
#ifdef USE_QDBM
48 4cab1247 Hiroyuki Yamamoto
        xfilter_kvs_qdbm_set_engine();
49 4cab1247 Hiroyuki Yamamoto
#endif
50 4cab1247 Hiroyuki Yamamoto
        xfilter_bayes_db_init();
51 4cab1247 Hiroyuki Yamamoto
52 4cab1247 Hiroyuki Yamamoto
        for (i = 1; i < argc; i++) {
53 4cab1247 Hiroyuki Yamamoto
                if (!strcmp(argv[i], "-j"))
54 4cab1247 Hiroyuki Yamamoto
                        mode = MODE_LEARN_JUNK;
55 4cab1247 Hiroyuki Yamamoto
                else if (!strcmp(argv[i], "-c"))
56 4cab1247 Hiroyuki Yamamoto
                        mode = MODE_LEARN_CLEAN;
57 4cab1247 Hiroyuki Yamamoto
                else if (!strcmp(argv[i], "-t"))
58 4cab1247 Hiroyuki Yamamoto
                        mode = MODE_TEST_JUNK;
59 af7ecefa Hiroyuki Yamamoto
                else if (!strcmp(argv[i], "-s"))
60 af7ecefa Hiroyuki Yamamoto
                        mode = MODE_SHOW_STATUS;
61 0113a62c Hiroyuki Yamamoto
                else if (!strcmp(argv[i], "-v"))
62 0113a62c Hiroyuki Yamamoto
                        verbose = 1;
63 0113a62c Hiroyuki Yamamoto
                else if (!strcmp(argv[i], "-d"))
64 0113a62c Hiroyuki Yamamoto
                        xfilter_set_debug_mode(1);
65 4cab1247 Hiroyuki Yamamoto
        }
66 4cab1247 Hiroyuki Yamamoto
67 af7ecefa Hiroyuki Yamamoto
        if (mode == MODE_SHOW_STATUS) {
68 af7ecefa Hiroyuki Yamamoto
                retval = xfilter_bayes_db_show_contents();
69 e260dbfd Hiroyuki Yamamoto
        } else if (mode == MODE_LEARN_JUNK || mode == MODE_LEARN_CLEAN) {
70 e260dbfd Hiroyuki Yamamoto
                for (i = 1; i < argc; i++) {
71 e260dbfd Hiroyuki Yamamoto
                        if (argv[i][0] != '-') {
72 e260dbfd Hiroyuki Yamamoto
                                retval = learn_filter(mode, argv[i]);
73 e260dbfd Hiroyuki Yamamoto
                                if (retval != 0)
74 e260dbfd Hiroyuki Yamamoto
                                        break;
75 e260dbfd Hiroyuki Yamamoto
                        }
76 e260dbfd Hiroyuki Yamamoto
                }
77 e260dbfd Hiroyuki Yamamoto
        } else {
78 e260dbfd Hiroyuki Yamamoto
                for (i = 1; i < argc; i++) {
79 e260dbfd Hiroyuki Yamamoto
                        if (argv[i][0] != '-') {
80 e260dbfd Hiroyuki Yamamoto
                                retval = test_filter(mode, argv[i]);
81 704a6ae7 Hiroyuki Yamamoto
                                if (retval == 127)
82 704a6ae7 Hiroyuki Yamamoto
                                        break;
83 e260dbfd Hiroyuki Yamamoto
                        }
84 e260dbfd Hiroyuki Yamamoto
                }
85 e260dbfd Hiroyuki Yamamoto
        }
86 4cab1247 Hiroyuki Yamamoto
87 4cab1247 Hiroyuki Yamamoto
        xfilter_bayes_db_done();
88 4cab1247 Hiroyuki Yamamoto
        xfilter_done();
89 4cab1247 Hiroyuki Yamamoto
90 4cab1247 Hiroyuki Yamamoto
        return retval;
91 4cab1247 Hiroyuki Yamamoto
}
92 4cab1247 Hiroyuki Yamamoto
93 4cab1247 Hiroyuki Yamamoto
static int learn_filter(int mode, const char *file)
94 4cab1247 Hiroyuki Yamamoto
{
95 4012ec30 Hiroyuki Yamamoto
        XFilterManager *mgr;
96 4012ec30 Hiroyuki Yamamoto
        XMessageData *msgdata;
97 4012ec30 Hiroyuki Yamamoto
        XMessageData *resdata;
98 4012ec30 Hiroyuki Yamamoto
        XFilterResult *res;
99 4012ec30 Hiroyuki Yamamoto
        XFilterStatus status;
100 cfadedec Hiroyuki Yamamoto
        int retval = 0;
101 4012ec30 Hiroyuki Yamamoto
102 faa55f07 Hiroyuki Yamamoto
        XFilterConstructorFunc learn_junk_ctors[] = {
103 4012ec30 Hiroyuki Yamamoto
                xfilter_textcontent_new,
104 4012ec30 Hiroyuki Yamamoto
                xfilter_wordsep_new,
105 4012ec30 Hiroyuki Yamamoto
                xfilter_ngram_new,
106 faa55f07 Hiroyuki Yamamoto
                xfilter_bayes_learn_junk_new,
107 faa55f07 Hiroyuki Yamamoto
                NULL
108 faa55f07 Hiroyuki Yamamoto
        };
109 faa55f07 Hiroyuki Yamamoto
110 faa55f07 Hiroyuki Yamamoto
        XFilterConstructorFunc learn_nojunk_ctors[] = {
111 faa55f07 Hiroyuki Yamamoto
                xfilter_textcontent_new,
112 faa55f07 Hiroyuki Yamamoto
                xfilter_wordsep_new,
113 faa55f07 Hiroyuki Yamamoto
                xfilter_ngram_new,
114 faa55f07 Hiroyuki Yamamoto
                xfilter_bayes_learn_nojunk_new,
115 4012ec30 Hiroyuki Yamamoto
                NULL
116 4012ec30 Hiroyuki Yamamoto
        };
117 4012ec30 Hiroyuki Yamamoto
118 704a6ae7 Hiroyuki Yamamoto
        if (verbose)
119 704a6ae7 Hiroyuki Yamamoto
                printf("learning message file: %s\n", file);
120 704a6ae7 Hiroyuki Yamamoto
121 4012ec30 Hiroyuki Yamamoto
        mgr = xfilter_manager_new();
122 4012ec30 Hiroyuki Yamamoto
123 4cab1247 Hiroyuki Yamamoto
        if (mode == MODE_LEARN_JUNK)
124 faa55f07 Hiroyuki Yamamoto
                xfilter_manager_add_filters(mgr, learn_junk_ctors);
125 faa55f07 Hiroyuki Yamamoto
        else
126 faa55f07 Hiroyuki Yamamoto
                xfilter_manager_add_filters(mgr, learn_nojunk_ctors);
127 4012ec30 Hiroyuki Yamamoto
128 4cab1247 Hiroyuki Yamamoto
        msgdata = xfilter_message_data_read_file(file, "message/rfc822");
129 4012ec30 Hiroyuki Yamamoto
130 4012ec30 Hiroyuki Yamamoto
        res = xfilter_manager_run(mgr, msgdata);
131 0113a62c Hiroyuki Yamamoto
        if (verbose)
132 0113a62c Hiroyuki Yamamoto
                xfilter_result_print(res);
133 4012ec30 Hiroyuki Yamamoto
        status = xfilter_result_get_status(res);
134 704a6ae7 Hiroyuki Yamamoto
        if (status == XF_UNSUPPORTED_TYPE || status == XF_ERROR) {
135 704a6ae7 Hiroyuki Yamamoto
                printf("%s: Error on learning mail\n", file);
136 704a6ae7 Hiroyuki Yamamoto
                retval = 127;
137 704a6ae7 Hiroyuki Yamamoto
        }
138 4012ec30 Hiroyuki Yamamoto
139 704a6ae7 Hiroyuki Yamamoto
        if (xfilter_get_debug_mode()) {
140 0113a62c Hiroyuki Yamamoto
                resdata = xfilter_result_get_message_data(res);
141 0113a62c Hiroyuki Yamamoto
                print_message_data(resdata);
142 0113a62c Hiroyuki Yamamoto
        }
143 4012ec30 Hiroyuki Yamamoto
144 4012ec30 Hiroyuki Yamamoto
        xfilter_result_free(res);
145 4012ec30 Hiroyuki Yamamoto
        xfilter_message_data_free(msgdata);
146 4012ec30 Hiroyuki Yamamoto
        xfilter_manager_free(mgr);
147 4012ec30 Hiroyuki Yamamoto
148 704a6ae7 Hiroyuki Yamamoto
        return retval;
149 4cab1247 Hiroyuki Yamamoto
}
150 4012ec30 Hiroyuki Yamamoto
151 4cab1247 Hiroyuki Yamamoto
static int test_filter(int mode, const char *file)
152 4cab1247 Hiroyuki Yamamoto
{
153 4cab1247 Hiroyuki Yamamoto
        XFilterManager *mgr;
154 4cab1247 Hiroyuki Yamamoto
        XMessageData *msgdata;
155 4cab1247 Hiroyuki Yamamoto
        XMessageData *resdata;
156 4cab1247 Hiroyuki Yamamoto
        XFilterResult *res;
157 4cab1247 Hiroyuki Yamamoto
        XFilterStatus status;
158 4cab1247 Hiroyuki Yamamoto
        int retval = 0;
159 4012ec30 Hiroyuki Yamamoto
160 4cab1247 Hiroyuki Yamamoto
        XFilterConstructorFunc ctors[] = {
161 4cab1247 Hiroyuki Yamamoto
                xfilter_textcontent_new,
162 4cab1247 Hiroyuki Yamamoto
                xfilter_blacklist_new,
163 4cab1247 Hiroyuki Yamamoto
                xfilter_whitelist_new,
164 4cab1247 Hiroyuki Yamamoto
                xfilter_wordsep_new,
165 4cab1247 Hiroyuki Yamamoto
                xfilter_ngram_new,
166 4cab1247 Hiroyuki Yamamoto
                xfilter_bayes_new,
167 4cab1247 Hiroyuki Yamamoto
                NULL
168 4cab1247 Hiroyuki Yamamoto
        };
169 4012ec30 Hiroyuki Yamamoto
170 704a6ae7 Hiroyuki Yamamoto
        if (verbose)
171 704a6ae7 Hiroyuki Yamamoto
                printf("testing message file: %s\n", file);
172 704a6ae7 Hiroyuki Yamamoto
173 4cab1247 Hiroyuki Yamamoto
        mgr = xfilter_manager_new();
174 4cab1247 Hiroyuki Yamamoto
        xfilter_manager_add_filters(mgr, ctors);
175 4012ec30 Hiroyuki Yamamoto
176 4cab1247 Hiroyuki Yamamoto
        msgdata = xfilter_message_data_read_file(file, "message/rfc822");
177 4012ec30 Hiroyuki Yamamoto
178 4012ec30 Hiroyuki Yamamoto
        res = xfilter_manager_run(mgr, msgdata);
179 0113a62c Hiroyuki Yamamoto
        if (verbose)
180 0113a62c Hiroyuki Yamamoto
                xfilter_result_print(res);
181 4012ec30 Hiroyuki Yamamoto
        status = xfilter_result_get_status(res);
182 4cab1247 Hiroyuki Yamamoto
        if (status == XF_JUNK) {
183 704a6ae7 Hiroyuki Yamamoto
                printf("%s: This is a junk mail (prob: %f)\n", file, xfilter_result_get_probability(res));
184 f45a6905 Hiroyuki Yamamoto
                retval = 0;
185 4cab1247 Hiroyuki Yamamoto
        } else if (status == XF_UNCERTAIN) {
186 704a6ae7 Hiroyuki Yamamoto
                printf("%s: This mail could not be classified (prob: %f)\n", file, xfilter_result_get_probability(res));
187 f45a6905 Hiroyuki Yamamoto
                retval = 2;
188 4cab1247 Hiroyuki Yamamoto
        } else if (status == XF_UNSUPPORTED_TYPE || status == XF_ERROR) {
189 704a6ae7 Hiroyuki Yamamoto
                printf("%s: Error on testing mail\n", file);
190 f45a6905 Hiroyuki Yamamoto
                retval = 127;
191 4cab1247 Hiroyuki Yamamoto
        } else {
192 704a6ae7 Hiroyuki Yamamoto
                printf("%s: This is a clean mail (prob: %f)\n", file, xfilter_result_get_probability(res));
193 f45a6905 Hiroyuki Yamamoto
                retval = 1;
194 4cab1247 Hiroyuki Yamamoto
        }
195 4012ec30 Hiroyuki Yamamoto
196 704a6ae7 Hiroyuki Yamamoto
        if (xfilter_get_debug_mode()) {
197 0113a62c Hiroyuki Yamamoto
                resdata = xfilter_result_get_message_data(res);
198 0113a62c Hiroyuki Yamamoto
                print_message_data(resdata);
199 0113a62c Hiroyuki Yamamoto
        }
200 4012ec30 Hiroyuki Yamamoto
201 4012ec30 Hiroyuki Yamamoto
        xfilter_result_free(res);
202 4012ec30 Hiroyuki Yamamoto
        xfilter_message_data_free(msgdata);
203 4012ec30 Hiroyuki Yamamoto
204 4012ec30 Hiroyuki Yamamoto
        xfilter_manager_free(mgr);
205 4012ec30 Hiroyuki Yamamoto
206 f45a6905 Hiroyuki Yamamoto
        return retval;
207 4012ec30 Hiroyuki Yamamoto
}
208 295ccf38 Hiroyuki Yamamoto
209 295ccf38 Hiroyuki Yamamoto
static void print_message_data(XMessageData *msgdata)
210 295ccf38 Hiroyuki Yamamoto
{
211 295ccf38 Hiroyuki Yamamoto
        const char *content;
212 295ccf38 Hiroyuki Yamamoto
213 295ccf38 Hiroyuki Yamamoto
        if (!msgdata)
214 295ccf38 Hiroyuki Yamamoto
                return;
215 295ccf38 Hiroyuki Yamamoto
216 295ccf38 Hiroyuki Yamamoto
        printf("\n");
217 295ccf38 Hiroyuki Yamamoto
218 295ccf38 Hiroyuki Yamamoto
        content = xfilter_message_data_get_attribute(msgdata, XM_FROM);
219 295ccf38 Hiroyuki Yamamoto
        if (content)
220 295ccf38 Hiroyuki Yamamoto
                printf("from: %s\n", content);
221 295ccf38 Hiroyuki Yamamoto
        content = xfilter_message_data_get_attribute(msgdata, XM_TO);
222 295ccf38 Hiroyuki Yamamoto
        if (content)
223 295ccf38 Hiroyuki Yamamoto
                printf("to: %s\n", content);
224 295ccf38 Hiroyuki Yamamoto
        content = xfilter_message_data_get_attribute(msgdata, XM_CC);
225 295ccf38 Hiroyuki Yamamoto
        if (content)
226 295ccf38 Hiroyuki Yamamoto
                printf("cc: %s\n", content);
227 295ccf38 Hiroyuki Yamamoto
        content = xfilter_message_data_get_attribute(msgdata, XM_SUBJECT);
228 295ccf38 Hiroyuki Yamamoto
        if (content)
229 295ccf38 Hiroyuki Yamamoto
                printf("subject: %s\n", content);
230 295ccf38 Hiroyuki Yamamoto
        content = xfilter_message_data_get_content(msgdata);
231 295ccf38 Hiroyuki Yamamoto
        printf("content: %s\n", content);
232 295ccf38 Hiroyuki Yamamoto
}