Browse Source

Adopt for the new headers structure.

tags/1.0.0
Vsevolod Stakhov 9 years ago
parent
commit
11b20dddd8
3 changed files with 22 additions and 16 deletions
  1. 14
    11
      src/libmime/message.c
  2. 6
    3
      src/libserver/dkim.c
  3. 2
    2
      src/lua/lua_task.c

+ 14
- 11
src/libmime/message.c View File



/* Convert raw headers to a list of struct raw_header * */ /* Convert raw headers to a list of struct raw_header * */
static void static void
process_raw_headers (struct rspamd_task *task)
process_raw_headers (struct rspamd_task *task, GHashTable *target,
const gchar *in, gsize len)
{ {
struct raw_header *new = NULL; struct raw_header *new = NULL;
const gchar *p, *c, *end; const gchar *p, *c, *end;
gint state = 0, l, next_state = 100, err_state = 100, t_state; gint state = 0, l, next_state = 100, err_state = 100, t_state;
gboolean valid_folding = FALSE; gboolean valid_folding = FALSE;


p = task->raw_headers_content.begin;
end = p + task->raw_headers_content.len;
p = in;
end = p + len;
c = p; c = p;


while (p < end) { while (p < end) {
new->decoded = g_mime_utils_header_decode_text (new->value); new->decoded = g_mime_utils_header_decode_text (new->value);
rspamd_mempool_add_destructor (task->task_pool, rspamd_mempool_add_destructor (task->task_pool,
(rspamd_mempool_destruct_t)g_free, new->decoded); (rspamd_mempool_destruct_t)g_free, new->decoded);
append_raw_header (task->raw_headers, new);
append_raw_header (target, new);
state = 0; state = 0;
break; break;
case 5: case 5:
/* Header has only name, no value */ /* Header has only name, no value */
new->value = ""; new->value = "";
new->decoded = NULL; new->decoded = NULL;
append_raw_header (task->raw_headers, new);
append_raw_header (target, new);
state = 0; state = 0;
break; break;
case 99: case 99:
(rspamd_mempool_destruct_t) g_hash_table_destroy, (rspamd_mempool_destruct_t) g_hash_table_destroy,
mime_part->raw_headers); mime_part->raw_headers);
if (hdrs != NULL) { if (hdrs != NULL) {
process_raw_headers (mime_part->raw_headers,
task->task_pool, hdrs);
process_raw_headers (task, mime_part->raw_headers,
hdrs, strlen (hdrs));
g_free (hdrs); g_free (hdrs);
} }


hdr_end = g_mime_parser_get_headers_end (parser); hdr_end = g_mime_parser_get_headers_end (parser);
if (hdr_start != -1 && hdr_end != -1) { if (hdr_start != -1 && hdr_end != -1) {
g_assert (hdr_start < hdr_end); g_assert (hdr_start < hdr_end);
g_assert (hdr_end < len);
task->raw_headers_content.begin = p + hdr_start;
task->raw_headers_content.len = hdr_end - hdr_start;
process_raw_headers (task);
g_assert (hdr_end < (gint64)len);
task->raw_headers_content.begin = (gchar *)(p + hdr_start);
task->raw_headers_content.len = (guint64)(hdr_end - hdr_start);
process_raw_headers (task, task->raw_headers,
task->raw_headers_content.begin,
task->raw_headers_content.len);
} }


process_images (task); process_images (task);

+ 6
- 3
src/libserver/dkim.c View File

static gboolean static gboolean
rspamd_dkim_canonize_header_simple (rspamd_dkim_context_t *ctx, rspamd_dkim_canonize_header_simple (rspamd_dkim_context_t *ctx,
const gchar *headers, const gchar *headers,
gsize headers_length,
const gchar *header_name, const gchar *header_name,
guint count, guint count,
gboolean is_sign) gboolean is_sign)
{ {
const gchar *p, *c;
const gchar *p, *c, *end;
gint state = 0, hlen; gint state = 0, hlen;
gboolean found = FALSE; gboolean found = FALSE;
GArray *to_sign; GArray *to_sign;
sizeof (struct rspamd_dkim_sign_chunk), sizeof (struct rspamd_dkim_sign_chunk),
count); count);
p = headers; p = headers;
end = p + headers_length;
c = p; c = p;
hlen = strlen (header_name); hlen = strlen (header_name);


while (*p) {
while (p < end) {
switch (state) { switch (state) {
case 0: case 0:
/* Compare state */ /* Compare state */


if (ctx->header_canon_type == DKIM_CANON_SIMPLE) { if (ctx->header_canon_type == DKIM_CANON_SIMPLE) {
return rspamd_dkim_canonize_header_simple (ctx, return rspamd_dkim_canonize_header_simple (ctx,
task->raw_headers_str,
task->raw_headers_content.begin,
task->raw_headers_content.len,
header_name, header_name,
count, count,
is_sig); is_sig);

+ 2
- 2
src/lua/lua_task.c View File

if (task) { if (task) {
t = lua_newuserdata (L, sizeof (*t)); t = lua_newuserdata (L, sizeof (*t));
rspamd_lua_setclass (L, "rspamd{text}", -1); rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = task->raw_headers_str;
t->len = strlen (t->start);
t->start = task->raw_headers_content.begin;
t->len = task->raw_headers_content.len;
t->own = FALSE; t->own = FALSE;
} }
else { else {

Loading…
Cancel
Save