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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/**
* @file message.h
* Message processing functions and structures
*/
#ifndef RSPAMD_MESSAGE_H
#define RSPAMD_MESSAGE_H
#include "config.h"
#include "email_addr.h"
#include "addr.h"
#include "cryptobox.h"
#include <gmime/gmime.h>
struct rspamd_task;
struct controller_session;
struct html_content;
enum rspamd_mime_part_flags {
RSPAMD_MIME_PART_TEXT = (1 << 0),
RSPAMD_MIME_PART_ATTACHEMENT = (1 << 1),
RSPAMD_MIME_PART_IMAGE = (1 << 2),
RSPAMD_MIME_PART_ARCHIVE = (1 << 3)
};
struct rspamd_mime_part {
GMimeContentType *type;
GByteArray *content;
GMimeObject *parent;
GMimeObject *mime;
GHashTable *raw_headers;
gchar *raw_headers_str;
guchar digest[rspamd_cryptobox_HASHBYTES];
const gchar *filename;
const gchar *boundary;
gpointer specific_data;
enum rspamd_mime_part_flags flags;
};
#define RSPAMD_MIME_TEXT_PART_FLAG_UTF (1 << 0)
#define RSPAMD_MIME_TEXT_PART_FLAG_BALANCED (1 << 1)
#define RSPAMD_MIME_TEXT_PART_FLAG_EMPTY (1 << 2)
#define RSPAMD_MIME_TEXT_PART_FLAG_HTML (1 << 3)
#define IS_PART_EMPTY(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_EMPTY)
#define IS_PART_UTF(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_UTF)
#define IS_PART_RAW(part) (!((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_UTF))
#define IS_PART_HTML(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_HTML)
struct rspamd_mime_text_part {
guint flags;
GUnicodeScript script;
const gchar *lang_code;
const gchar *language;
const gchar *real_charset;
GByteArray *orig;
GByteArray *content;
GByteArray *stripped_content; /**< no newlines or html tags */
GPtrArray *newlines; /**< positions of newlines in text */
struct html_content *html;
GList *exceptions; /**< list of offsets of urls */
GMimeObject *parent;
struct rspamd_mime_part *mime_part;
GArray *normalized_words;
GArray *normalized_hashes;
guint nlines;
guint64 hash;
};
enum rspamd_received_type {
RSPAMD_RECEIVED_SMTP = 0,
RSPAMD_RECEIVED_ESMTP,
RSPAMD_RECEIVED_ESMTPA,
RSPAMD_RECEIVED_ESMTPS,
RSPAMD_RECEIVED_ESMTPSA,
RSPAMD_RECEIVED_LMTP,
RSPAMD_RECEIVED_IMAP,
RSPAMD_RECEIVED_UNKNOWN
};
struct received_header {
gchar *from_hostname;
gchar *from_ip;
gchar *real_hostname;
gchar *real_ip;
gchar *by_hostname;
rspamd_inet_addr_t *addr;
time_t timestamp;
enum rspamd_received_type type;
};
struct raw_header {
gchar *name;
gchar *value;
const gchar *raw_value; /* As it is in the message (unfolded and unparsed) */
gsize raw_len;
gboolean tab_separated;
gboolean empty_separator;
gchar *separator;
gchar *decoded;
};
/**
* Parse and pre-process mime message
* @param task worker_task object
* @return
*/
gboolean rspamd_message_parse (struct rspamd_task *task);
/**
* Get an array of header's values with specified header's name using raw headers
* @param task worker task structure
* @param field header's name
* @param strong if this flag is TRUE header's name is case sensitive, otherwise it is not
* @return An array of header's values or NULL. It is NOT permitted to free array or values.
*/
GPtrArray *rspamd_message_get_header_array (struct rspamd_task *task,
const gchar *field,
gboolean strong);
/**
* Get an array of mime parts header's values with specified header's name using raw headers
* @param task worker task structure
* @param field header's name
* @param strong if this flag is TRUE header's name is case sensitive, otherwise it is not
* @return An array of header's values or NULL. It is NOT permitted to free array or values.
*/
GPtrArray *rspamd_message_get_mime_header_array (struct rspamd_task *task,
const gchar *field,
gboolean strong);
/**
* Get an array of header's values with specified header's name using raw headers
* @param htb hash table indexed by header name (caseless) with ptr arrays as elements
* @param field header's name
* @param strong if this flag is TRUE header's name is case sensitive, otherwise it is not
* @return An array of header's values or NULL. It is NOT permitted to free array or values.
*/
GPtrArray *rspamd_message_get_header_from_hash (GHashTable *htb,
rspamd_mempool_t *pool,
const gchar *field,
gboolean strong);
#endif
|