/* $Id: decode.h,v 1.21 2011/06/28 00:13:48 sbajic Exp $ */
/*
DSPAM
COPYRIGHT (C) 2002-2012 DSPAM PROJECT
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
#include
#include
#ifdef HAVE_UNISTD_H
# include
#endif
#include "nodetree.h"
#include "buffer.h"
#ifndef _DECODE_H
#define _DECODE_H
/*
* _ds_header_field
*
* DESCRIPTION
* a single header/value paid from a message block
*/
typedef struct _ds_header_field
{
char *heading;
char *data;
char *original_data; /* prior to decoding */
char *concatenated_data; /* multi-line */
} *ds_header_t;
/*
* _ds_message_part
*
* DESCRIPTION
* a message block (or part) within a message. in a single-part message,
* there will be only one block (block 0). in a multipart message, each part
* will be separated into a separte block. the message block consists of:
* - a dynamic array of headers (nodetree of ds_header_t's) for the block
* - body data (NULL if there is no body)
* - block encoding
* - block media type information
* - boundary and terminating boundary information
*/
typedef struct _ds_message_part
{
struct nt * headers;
buffer * body;
buffer * original_signed_body;
char * boundary;
char * terminating_boundary;
int encoding;
int original_encoding;
int media_type;
int media_subtype;
int content_disposition;
} *ds_message_part_t;
/*
* _ds_message
*
* DESCRIPTION
* the actual message structure, comprised of an array of message blocks.
* in a non-multipart email, there will only be one message block (block 0).
* in multipart emails, however, the first message block will represent the
* header (with a NULL body_data or something like "This is a multi-part
* message"), and each additional block within the email will be given its
* own message_part structure with its own headers, boundary, etc.
*
* embedded multipart messages are not realized by the structure, but can
* be identified by examining the media type or headers.
*/
typedef struct _ds_message
{
struct nt * components;
int protect;
} *ds_message_t;
/* adapter dependent functions */
char * _ds_decode_base64 (const char *body);
char * _ds_decode_quoted (const char *body);
/* Adapter-independent functions */
ds_message_t _ds_actualize_message (const char *message);
char * _ds_assemble_message (ds_message_t message, const char *newline);
char * _ds_find_header (ds_message_t message, const char *heading);
ds_message_part_t _ds_create_message_part (void);
ds_header_t _ds_create_header_field (const char *heading);
void _ds_analyze_header
(ds_message_part_t block, ds_header_t header, struct nt *boundaries);
void _ds_destroy_message (ds_message_t message);
void _ds_destroy_headers (ds_message_part_t block);
void _ds_destroy_block (ds_message_part_t block);
char * _ds_decode_block (ds_message_part_t block);
int _ds_encode_block (ds_message_part_t block, int encoding);
char * _ds_encode_base64 (const char *body);
char * _ds_encode_quoted (const char *body);
char * _ds_decode_hex8bit (const char *body);
int _ds_decode_headers (ds_message_part_t block);
int _ds_push_boundary (struct nt *stack, const char *boundary);
int _ds_match_boundary (struct nt *stack, const char *buff);
int _ds_extract_boundary (char *buf, size_t size, char *data);
char * _ds_pop_boundary (struct nt *stack);
char * _ds_strip_html (const char *html);
int _ds_hex2dec (unsigned char hex);
/* Encoding values */
#define EN_7BIT 0x00
#define EN_8BIT 0x01
#define EN_QUOTED_PRINTABLE 0x02
#define EN_BASE64 0x03
#define EN_BINARY 0x04
#define EN_UNKNOWN 0xFE
#define EN_OTHER 0xFF
/* Media types which are relevant to DSPAM */
#define MT_TEXT 0x00
#define MT_MULTIPART 0x01
#define MT_MESSAGE 0x02
#define MT_APPLICATION 0x03
#define MT_UNKNOWN 0xFE
#define MT_OTHER 0xFF
/* Media subtypes which are relevant to DSPAM */
#define MST_PLAIN 0x00
#define MST_HTML 0x01
#define MST_MIXED 0x02
#define MST_ALTERNATIVE 0x03
#define MST_RFC822 0x04
#define MST_DSPAM_SIGNATURE 0x05
#define MST_SIGNED 0x06
#define MST_INOCULATION 0x07
#define MST_ENCRYPTED 0x08
#define MST_UNKNOWN 0xFE
#define MST_OTHER 0xFF
/* Part Content-Dispositions */
#define PCD_INLINE 0x00
#define PCD_ATTACHMENT 0x01
#define PCD_UNKNOWN 0xFE
#define PCD_OTHER 0xFF
/* Block position; used when analyzing a message */
#define BP_HEADER 0x00
#define BP_BODY 0x01
#endif /* _DECODE_H */